我试图拦截 WebView 发送的每个请求并在执行请求之前修改 header 。有很多关于如何执行此操作的示例( like this one ),但我无法完全让它工作。页面能够正常加载,但所有请求都类似于 this在 Chrome 调试器中;他们警告“显示临时标题”,但我的标题都不存在。
这是我的代码的相关部分:
public class MyWebView extends WebView {
public MyWebView(Context context) {
super(context);
setWebViewClient(new MyWebViewClient());
}
private class MyWebViewClient extends WebViewClient {
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
WebResourceResponse response = null;
try {
URL url = new URL(request.getUrl().toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(request.getMethod());
conn.setRequestProperty("test-header", "test-value");
InputStream data;
if (conn.getResponseCode() / 100 == 2) {
data = conn.getInputStream();
}
else {
data = conn.getErrorStream();
}
response = new WebResourceResponse("text/html", "UTF-8", data);
}
catch (IOException e) {
}
return response;
}
}
}
我也尝试使用 OkHttp 代替,但得到了相同的结果。有人能够让它工作吗?
最佳答案
试试这个,通过shouldOverrideUrlLoading而不是shouldInterceptRequest
public class MyWebView extends WebView {
public MyWebView(Context context) {
super(context);
setWebViewClient(new MyWebViewClient());
}
private class MyWebViewClient extends WebViewClient {
@Override
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
{
final String url = request.getUrl().toString();
return getNewResponse(url);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
return getNewResponse(url);
}
private WebResourceResponse getNewResponse(String url) {
final OkHttpClient httpClient = new OkHttpClient();
Response response = null;
try {
final Request request = new Request.Builder()
.url(url.trim())
.addHeader("test-header", "test-value")
.build();
response = httpClient.newCall(request).execute();
}
catch (Exception e) {
}
if (response == null) {
return null;
}
return new WebResourceResponse(
getMimeType(url),
response.header("content-encoding", "utf-8"),
response.body().byteStream()
);
}
private String getMimeType(String url) {
final String extension = MimeTypeMap.getFileExtensionFromUrl(url);
if (extension == null) {
return null;
}
switch (extension) {
case "js":
return "text/javascript";
case "woff":
return "application/font-woff";
case "woff2":
return "application/font-woff2";
case "ttf":
return "application/x-font-ttf";
case "eot":
return "application/vnd.ms-fontobject";
case "svg":
return "image/svg+xml";
case "mp4":
return "video/mp4";
}
return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
}
}
}
关于java - 无法在 Android WebView 中设置 HttpURLConnection header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51775116/