java - 无法在 Android WebView 中设置 HttpURLConnection header

标签 java android httpurlconnection

我试图拦截 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/

相关文章:

java - 为什么 BufferedInputStream 一次最多读取 2048 个字节?

java - Webservice调用返回错误500

android - HttpURLConnection responsecode 随机-1

Java map 问题

java - IntelliJ IDEA,jbehave 支持插件找不到声明去

java - 将日期设置为选项卡

java - 将构造函数参数分配给成员变量, ".this cannot be referenced from a static context"

android - 如何在 Android 屏幕上移动图像

java - 为什么在 ByteBuffer 中可以直接分配字节,而不能在 FloatBuffer 中分配 float

java - 对java构造函数感到困惑