【发布时间】:2015-12-06 19:43:44
【问题描述】:
我在我的应用程序中使用WebView,我必须在其中拦截请求。我目前正在使用以下代码来执行此操作。
public WebResourceResponse shouldInterceptRequest (WebView view, String url) {
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setRequestProperty("User-Agent", userAgent);
String mime;
if (url.lastIndexOf('.') > url.lastIndexOf('/')) {
String ext = url.substring(url.lastIndexOf('.') + 1);
mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext);
} else {
mime = "text/html";
}
return new WebResourceResponse(mime, "UTF-8", conn.getInputStream());
}
以上代码在大多数情况下都能正常工作,但并非全部。例如,当我尝试登录 Outlook 时,它只是显示我的电子邮件或密码不正确,我还看到了其他请求被破坏的情况,但如果我删除 shouldInterceptRequest,一切正常。
有没有比我目前用来拦截请求更好的方法?
【问题讨论】:
-
您没有显示拦截请求的代码。谁的要求?
-
当然是
WebView的请求。上面的代码拦截请求。我只是没有写public WebResourceResponse shouldInte...,所以问题会更干净。 -
对我来说这段代码看起来不错,除非 if (url.lastIndexOf('.') > url.lastIndexOf('/')) 这可以设置错误的 mime 类型来响应。例如,如果我们假设 PNG 图像的 URL 是 example.com/image1,那么您的 mime 类型将是错误的。我建议您用类似 stackoverflow.com/a/30101299/669159 的代码替换该代码,以得出应为响应 mime 的结论。
-
为什么需要拦截请求?至少从您的代码来看,您只是在设置 UserAgent。您是否尝试过使用 setUserAgentString? developer.android.com/reference/android/webkit/…
-
@Raanan 我实际上做了更多的事情,比如为某些域添加 cookie,而为其他一些域添加 cookie,我没有包含在问题中,因为我确信代码中的问题是获取请求的 URL 的内容类型。