日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OkHttp如何移除User-Agent,Accept-Encoding等框架自动添加的请求头参数

發布時間:2024/4/13 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OkHttp如何移除User-Agent,Accept-Encoding等框架自动添加的请求头参数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用OkHttp網絡框架在進行網絡請求時會發現,傳到后臺的請求頭中會比我們自己添加的參數多出幾個額外參數。查看源碼會發現

private Response getResponseWithInterceptorChain() throws IOException {// Build a full stack of interceptors.List<Interceptor> 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<Cookie> 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等請求頭參數。有時候我們并不需要這些默認添加的參數,那么我們如何才能做到移除它們呢?

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

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內部在添加完BridgeInterceptor后,才開始添加networkInterceptors,所以我們需要借助網絡攔截器來重新攔截請求頭,并操作頭部參數。

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

public class NetInterceptorimplements Interceptor {private HttpClient builder;public NetInterceptor() {super();}public NetInterceptor(HttpClient builder) {this.builder = builder;}@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();//移除頭部參數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;}}}

然后再將自定義的攔截器設置為網絡攔截器

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<String, List<Cookie>> cookieStore = new HashMap<>();@Overridepublic void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) {cookieStore.put(httpUrl.host(), list);}@Overridepublic List<Cookie> loadForRequest(HttpUrl httpUrl) {List<Cookie> cookies = cookieStore.get(httpUrl.host());return cookies != null ? cookies : new ArrayList<Cookie>();}});NetInterceptor netInterceptor = new NetInterceptor(mbuilder);//mOkBuilder.addNetworkInterceptor(netInterceptor);//設置應用攔截器無效,因為BridgeInterceptor是在應用攔截器之后添加的mOkBuilder.addNetworkInterceptor(netInterceptor);

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

總結

以上是生活随笔為你收集整理的OkHttp如何移除User-Agent,Accept-Encoding等框架自动添加的请求头参数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。