成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

OkHttp如何移除User-Agent,Accept-Encoding等框架自動添加的請求頭參數(shù)

newsning / 3902人閱讀

摘要:移除頭部參數(shù)然后再將自定義的攔截器設(shè)置為網(wǎng)絡(luò)攔截器信任所有證書設(shè)置應(yīng)用攔截器無效,因為是在應(yīng)用攔截器之后添加的這樣就能達到移除自動添加的請求頭參數(shù)的目的了。

使用OkHttp網(wǎng)絡(luò)框架在進行網(wǎng)絡(luò)請求時會發(fā)現(xiàn),傳到后臺的請求頭中會比我們自己添加的參數(shù)多出幾個額外參數(shù)。查看源碼會發(fā)現(xiàn)

 private Response getResponseWithInterceptorChain() throws IOException {
    // Build a full stack of interceptors.
    List interceptors = new ArrayList<>();
    interceptors.addAll(client.interceptors());
    interceptors.add(retryAndFollowUpInterceptor);
    interceptors.add(new BridgeInterceptor(client.cookieJar()));
    interceptors.add(new CacheInterceptor(client.internalCache()));
    interceptors.add(new ConnectInterceptor(client));
    if (!retryAndFollowUpInterceptor.isForWebSocket()) {
      interceptors.addAll(client.networkInterceptors());
    }
    interceptors.add(new CallServerInterceptor(
        retryAndFollowUpInterceptor.isForWebSocket()));

    Interceptor.Chain chain = new RealInterceptorChain(
        interceptors, null, null, null, 0, originalRequest);
    return chain.proceed(originalRequest);
  }

OkHttp會默認添加一個橋接攔截器BridgeInterceptor,查看BridgeInterceptor的源碼

MediaType contentType = body.contentType();
      if (contentType != null) {
        requestBuilder.header("Content-Type", contentType.toString());
      }

      long contentLength = body.contentLength();
      if (contentLength != -1) {
        requestBuilder.header("Content-Length", Long.toString(contentLength));
        requestBuilder.removeHeader("Transfer-Encoding");
      } else {
        requestBuilder.header("Transfer-Encoding", "chunked");
        requestBuilder.removeHeader("Content-Length");
      }
    }

    if (userRequest.header("Host") == null) {
      requestBuilder.header("Host", hostHeader(userRequest.url(), false));
    }

    if (userRequest.header("Connection") == null) {
      requestBuilder.header("Connection", "Keep-Alive");
    }

    // If we add an "Accept-Encoding: gzip" header field we"re responsible for also decompressing
    // the transfer stream.
    boolean transparentGzip = false;
    if (userRequest.header("Accept-Encoding") == null) {
      transparentGzip = true;
      requestBuilder.header("Accept-Encoding", "gzip");
    }

    List cookies = cookieJar.loadForRequest(userRequest.url());
    if (!cookies.isEmpty()) {
      requestBuilder.header("Cookie", cookieHeader(cookies));
    }

    if (userRequest.header("User-Agent") == null) {
      requestBuilder.header("User-Agent", Version.userAgent());
    }

在BridgeInterceptor中會默認添加User-Agent,Accept-Encoding等請求頭參數(shù)。有時候我們并不需要這些默認添加的參數(shù),那么我們?nèi)绾尾拍茏龅揭瞥鼈兡兀?/p>

通過上面第一段的部分源碼

interceptors.add(retryAndFollowUpInterceptor);
interceptors.add(new BridgeInterceptor(client.cookieJar()));
interceptors.add(new CacheInterceptor(client.internalCache()));
interceptors.add(new ConnectInterceptor(client));
if (!retryAndFollowUpInterceptor.isForWebSocket()) {
  interceptors.addAll(client.networkInterceptors());
}

可以看到OkHttp內(nèi)部在添加完BridgeInterceptor后,才開始添加networkInterceptors,所以我們需要借助網(wǎng)絡(luò)攔截器來重新攔截請求頭,并操作頭部參數(shù)。

首先我們要自定義一個攔截器,在攔截器中移除我們不需要的參數(shù)。

public class NetInterceptorimplements Interceptor {

    private HttpClient builder;

    public NetInterceptor() {
        super();
    }

    public NetInterceptor(HttpClient builder) {
        this.builder = builder;
    }

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        //移除頭部參數(shù)
        request = request.newBuilder()
                    .removeHeader("User-Agent")
                    .removeHeader("Accept-Encoding")
                    .build();
        Response response = chain.proceed(request);
        if (response.body() != null && response.body().contentType() != null) {
            MediaType mediaType = response.body().contentType();
            String content = response.body().string();
            ResponseBody responseBody = ResponseBody.create(mediaType, content);
            return response.newBuilder().body(responseBody).build();
        } else {
            return response;
        }
    }

}

然后再將自定義的攔截器設(shè)置為網(wǎng)絡(luò)攔截器

  mOkBuilder = new Builder()
                .connectTimeout(mbuilder.getConnectTimeout(), TimeUnit.SECONDS)
                .readTimeout(mbuilder.getReadTimeout(), TimeUnit.SECONDS)
                .writeTimeout(mbuilder.getWriteTimeout(), TimeUnit.SECONDS)
                .sslSocketFactory(createSSLSocketFactory(), new TrustAllCerts())// 信任所有證書
                .hostnameVerifier(new TrustAllHostnameVerifier())
                .cookieJar(new CookieJar() {
                    private final HashMap> cookieStore = new HashMap<>();

                    @Override
                    public void saveFromResponse(HttpUrl httpUrl, List list) {
                        cookieStore.put(httpUrl.host(), list);
                    }

                    @Override
                    public List loadForRequest(HttpUrl httpUrl) {
                        List cookies = cookieStore.get(httpUrl.host());
                        return cookies != null ? cookies : new ArrayList();
                    }
                });

  NetInterceptor netInterceptor = new NetInterceptor(mbuilder);
  //mOkBuilder.addNetworkInterceptor(netInterceptor);//設(shè)置應(yīng)用攔截器無效,因為BridgeInterceptor是在應(yīng)用攔截器之后添加的
  mOkBuilder.addNetworkInterceptor(netInterceptor);

這樣就能達到移除BridgeInterceptor自動添加的請求頭參數(shù)的目的了。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76479.html

相關(guān)文章

  • RxEasyHttp一款基于RxJava2+Retrofit2實現(xiàn)簡單易用網(wǎng)絡(luò)請求框架

    摘要:注和是當下非?;鸨拈_源框架,均來自神一般的公司。特點比使用更簡單更易用。默認初始化如果使用默認始化后,一切采用默認設(shè)置。為單個請求設(shè)置超時,比如涉及到文件的需要設(shè)置讀寫等待時間多一點。 github源碼地址:https://github.com/zhou-you/RxEasyHttp RxEasyHttp 本庫是一款基于RxJava2+Retrofit2實現(xiàn)簡單易用的網(wǎng)絡(luò)請求框架,結(jié)...

    MadPecker 評論0 收藏0
  • HTTPie 官方文檔中文翻譯版

    摘要:目標是讓與的交互盡可能的更友好。在版本以上已經(jīng)成為了默認的版本。不同類型的鍵值對分割符號分別是。這將會協(xié)商服務(wù)端和你安裝的支持的最高協(xié)議版本。 博客原文? HTTPie 是一個命令行 HTTP 客戶端。目標是讓 CLI 與 Web services 的交互盡可能的更友好。它提供了一個簡單的 http 命令,可以讓我們用簡單自然的表述發(fā)送任意 HTTP 請求,并且可以輸出帶代碼高亮的結(jié)果...

    Baaaan 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<