如何使用 okhttp 更改连接请求的标头

Posted

技术标签:

【中文标题】如何使用 okhttp 更改连接请求的标头【英文标题】:How to change the header of connect request with okhttp 【发布时间】:2021-01-23 05:52:11 【问题描述】:

我安装了一个拦截器,它在我的 java okhttp4 客户端上设置自定义用户代理字符串。

public class UserAgentInterceptor implements Interceptor 
    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException 
        return chain.proceed(chain.request().newBuilder()
                .removeHeader("User-Agent")
                .addHeader("User-Agent", MYUSERAGENT);
    

client = new OkHttpClient.Builder()
                .addNetworkInterceptor(new UserAgentInterceptor())
                .build();

我用 Fiddler 检查了它,它似乎与请求 (GET/POST) 本身一起工作。但是,事先有一个 CONNECT 请求,它仍然具有 okhttp 标头。如何更改 CONNECT User-Agent 标头?

【问题讨论】:

【参考方案1】:

我终于通过添加自定义代理验证器解决了我的问题

new OkHttpClient.Builder()
                .proxyAuthenticator(new MyProxyAuthenticator())
                .addNetworkInterceptor(new UserAgentInterceptor());
public class MyProxyAuthenticator implements Authenticator 

    @Nullable
    @Override
    public Request authenticate(@Nullable Route route, @NotNull Response response) throws IOException 
        Request request = new JavaNetAuthenticator().authenticate(route, response);

        if (request == null) 
            request = new Request.Builder()
                    .url(route.address().url())
                    .method("CONNECT", null)
                    .header("Host", toHostHeader(route.address().url(), true))
                    .header("Proxy-Connection", "Keep-Alive")
                    .build();
        

        return request.newBuilder()
                .header("User-Agent", MYUSERAGENT)
                .build();
    

【讨论】:

感谢您的回答,为什么不在authentication函数中简单地写一行:return response.request().newBuilder() .header("User-Agent", MYUSERAGENT).build();

以上是关于如何使用 okhttp 更改连接请求的标头的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 Okhttp 中的默认缓存策略?

OkHttp 如何在不使用线程的情况下通过看似同步的 HTTP 连接执行并行 HTTP 请求?

如何使用 OkHttp/Retrofit 重试 HTTP 请求?

如何使用 OkHttp 连接 SPDY 网站?

在 android 中使用 okhttp 在 webview 中的每个请求中发送授权标头

如何使用NodeJS连接从请求中提取请求http标头