OkHttp如何移除User-Agent,Accept-Encoding等框架自动添加的请求头参数
生活随笔
收集整理的這篇文章主要介紹了
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等框架自动添加的请求头参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 调用远程service aidl接口定义
- 下一篇: [DeeplearningAI笔记]卷积