我试图拦截来自WebView的请求,以便我可以注入额外的标头。我将WebViewClient应用于WebView并覆盖shouldInterceptRequest()
。
在shouldInterceptRequest()
中,我打开连接,添加标题,然后在WebResourceResponse中返回打开的流。
如果初始打开连接失败,我不清楚应该如何处理IOException。
final Map<String, String> extraHeaders = getExtraHeaders(intent);
webview.setWebViewClient(new WebViewClient() {
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
final Uri uri = request.getUrl();
try {
URL url = new URL(uri.toString());
URLConnection con = url.openConnection();
for (Map.Entry<String, String> h : extraHeaders.entrySet()) {
con.addRequestProperty(h.getKey(), h.getValue());
}
final String contentType = con.getContentType().split(";")[0];
final String encoding = con.getContentEncoding();
return new WebResourceResponse(contentType, encoding, con.getInputStream());
} catch (IOException e) {
// what should we do now?
e.printStackTrace();
}
return super.shouldInterceptRequest(view, request);
}
});
我无法保密,因为它是经过检查的例外,不属于shouldInterceptRequest()
签名。
我无法将其包装在未经检查的异常中,因为WebView会将其删除并杀死该应用。
如果我捕获并忽略该异常,并默认使用super
方法(只返回null
),那么WebView将继续其默认行为并尝试发送请求(没有我的额外的标题)。这是不可取的,因为WebView自己的连接尝试实际上可能成功,并且缺少的标题将导致更多的问题。
似乎没有办法表明拦截失败,请求应该中止。
这里最好的事情是什么?
我试图返回模拟失败响应,但这不会被视为错误。 WebView显示包含响应内容的页面(来自异常的错误消息),并且不会调用WebViewClient的onReceivedError()
或onReceivedHttpError()
回调。
} catch (IOException e) {
InputStream is = new ByteArrayInputStream(e.getMessage().getBytes());
return new WebResourceResponse("text/plain", "UTF-8", 500, "Intercept failed",
Collections.<String, String>emptyMap(),
is);
}
答案 0 :(得分:1)
您可以尝试实例化新的WebResourceError,然后调用WebViewClient.onReceivedError。从未尝试过这样的事情,但这就是它的样子:
} catch (final IOException e) {
WebResourceError wre = new WebResourceError(){
@Override
public CharSequence getDescription (){
return e.toString();
}
@Override
public int getErrorCode (){
return WebViewClient.ERROR_CONNECT;
}
};
onReceivedError(view, request, wre);
return true;
}
如果您不想要或无法实例化WebResourceError
,还可以使用deprecated version of onReceivedError
。
答案 1 :(得分:-1)
表示发生了某种I / O异常。此类是由失败或中断的I / O操作产生的一般异常类。
IOException的() 构造一个IOException,其中包含null作为其错误详细消息。
IOException(String message) 使用指定的详细消息构造IOException。
IOException(String message,Throwable cause) 使用指定的详细消息和原因构造一个IOException。
IOException(Throwable cause) 使用指定的cause和详细消息构造一个IOException(cause == null?null:cause.toString())(其中 可能包含原因的类和详细信息。
您有关于IOException的示例
这里: