使用OkHttp網絡框架在進行網絡請求時會發現,傳到後臺的請求頭中會比咱們本身添加的參數多出幾個額外參數。查看源碼會發現cookie
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等請求頭參數。有時候咱們並不須要這些默認添加的參數,那麼咱們如何才能作到移除它們呢?框架
經過上面第一段的部分源碼ide
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,因此咱們須要藉助網絡攔截器來從新攔截請求頭,並操做頭部參數。ui
首先咱們要自定義一個攔截器,在攔截器中移除咱們不須要的參數。this
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(); //移除頭部參數 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; } } }
而後再將自定義的攔截器設置爲網絡攔截器url
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<>(); @Override public void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) { cookieStore.put(httpUrl.host(), list); } @Override public 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自動添加的請求頭參數的目的了。spa