Я пытаюсь написать собственный обработчик протокола для приложения JavaFX, которое использует веб-просмотр для доступа к одному веб-сайту. То, что я сделал до сих порПользовательский обработчик протокола JavaFX WebView
Мой заказ URLStreamHandlerFactory
public class MyURLStreamHandlerFactory implements URLStreamHandlerFactory {
public URLStreamHandler createURLStreamHandler(String protocol) {
System.out.println("Protocol: " + protocol);
if (protocol.equalsIgnoreCase("http") || protocol.equalsIgnoreCase("https")) {
return new MyURLStreamHandler();
} else {
return new URLStreamHandler() {
@Override
protected URLConnection openConnection(URL u) throws IOException {
return new URLConnection(u) {
@Override
public void connect() throws IOException {
}
};
}
};
}
}
}
Мой заказ URLStreamHandler
public class MyURLStreamHandler extends java.net.URLStreamHandler{
protected HttpURLConnection openConnection(URL u){
MyURLConnection q = new MyURLConnection(u);
return q;
}
}
Мой заказ HttpURLConnection
public class MyURLConnection extends HttpURLConnection {
static int defaultPort = 443;
InputStream in;
OutputStream out;
Socket s;
publicMyURLConnection(URL url) {
super(url);
try {
setRequestMethod("POST");
} catch (ProtocolException ex) {
ex.printStackTrace();
}
}
public void setRequestProperty(String name, String value){
super.setRequestProperty(name, value);
System.out.println("Namee: " + name);
System.out.println("Value: " + value);
}
public String getRequestProperty(String name){
System.out.println("GET REQUEST: ");
return super.getRequestProperty(name);
}
public OutputStream getOutputStream() throws IOException {
OutputStream os = super.getOutputStream();
System.out.println("Output: " + os);
return os;
}
public InputStream getInputStream() throws IOException {
InputStream is = super.getInputStream();
System.out.println("INout stream: " + is);
return is;
}
@Override
public void connect() throws IOException {
}
@Override
public void disconnect() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean usingProxy() {
throw new UnsupportedOperationException("Not supported yet.");
}
При запуске приложения я получаю следующее сообщение об ошибке althouhg кажется, что некоторые заголовки
Jul 08, 2013 11:09:04 AM com.sun.webpane.webkit.network.URLLoader doRun
WARNING: Unexpected error
java.net.UnknownServiceException: protocol doesn't support input
at java.net.URLConnection.getInputStream(URLConnection.java:839)
at qmed.QMedURLConnection.getInputStream(MyURLConnection.java:67)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468)
at com.sun.webpane.webkit.network.URLLoader.receiveResponse(URLLoader.java:383)
at com.sun.webpane.webkit.network.URLLoader.doRun(URLLoader.java:142)
at com.sun.webpane.webkit.network.URLLoader.access$000(URLLoader.java:44)
at com.sun.webpane.webkit.network.URLLoader$1.run(URLLoader.java:106)
at com.sun.webpane.webkit.network.URLLoader$1.run(URLLoader.java:103)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.webpane.webkit.network.URLLoader.run(URLLoader.java:103)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Все, что я хочу сделать, это получить ответ назад для данного запроса и прочитать его двоичные данные. Я хочу, чтобы протокол вел себя точно так же, как и по умолчанию, и проверял только двоичные данные данного респондента. Что я делаю не так?
Приложение делает все шорты URLConnections. Правильно ли использовать HTTPURLConnection в качестве моего настраиваемого класса URLConnection, когда протокол является http или https, и запускать URL-адрес URLStreamHandler по умолчанию, когда используются другие протоколы, как я делаю в MyURLStreamHandlerFactory? Должен ли я просто расширить класс URLConnection по умолчанию в MYURLConnection, чтобы обрабатывать все протоколы одинаково?
Любая помощь будет высоко ценится, как это проект угрожающим проблема
Спасибо
Отличный ответ. Пока я нашел его ближайшим к моим потребностям. Но я хочу захватить все протоколы. HTTP, HTTPS, file: // так же, как мы можем видеть все запросы в консоли разработчика. –
Что вы пытаетесь достичь с этим? Возможно, инструмент сетевого анализатора/анализатора сделает то, что вы хотите. –
Еще одна вещь, которая может помочь, - использовать FirebugLite: '' - вставьте этот код в вашу страницу WebView, и вы можете отлаживать страницу в WebView. К сожалению, FBLite не имеет сетевой вкладки. –