Android用OKHttp進行資料請求時,統一給所有介面新增某個請求引數
阿新 • • 發佈:2019-02-15
作為Android端最主流的聯網框架,OkHttp已經被很多人在很多專案中使用,可能大多數人都是會把OkHttp依賴加進去,然後初始化後再用retrofit來訪問介面,但是在開發過程中,如果做對應語言訊息返回的時候 比如手機是中文,服務端返回資料的提示就是中文,如果手機是英文,那麼服務端返回資料的提示是英文,所以在這個地方,就需要在請求介面的時候,給服務端傳遞一個語言引數,然後服務端就會根據這個傳過去的語言引數來返回不同語言的提示,好,我們現在要解決的就是傳遞語言引數的問題。
我之前在不知道OkHttp可以統一新增請求引數的時候,我是給每個介面都傳遞了一個語言引數,其實吧這樣的也可以,再其實吧,不傳也可以,因為服務端都會設定一個預設的返回提示,或者預設英文,或者預設中文的,但是後來接手了一個專案,這個專案也需要傳遞語言引數,但是我一看我的前輩寫的介面,大概一百多介面,都沒加這個引數,但是新需求上又需要傳遞這個,我不可能一個一個介面的加吧,那麼多,然後在百度上面找,就看到了OkHttp的這個,可以在初始化的時候給所有介面新增一個請求引數,下面是初始化OkHttp的程式碼,都通用的,就這個幾句,但是要給介面新增引數是寫註釋這一句:
com.squareup.okhttp.OkHttpClient okHttpClient = new com.squareup.okhttp.OkHttpClient().setHostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return false; } }).setCache(new Cache(Util.getCacheDir(), 1 * 1024 * 1024)) .setSslSocketFactory((SSLCertificateSocketFactory) SSLCertificateSocketFactory.getDefault(1000)); okHttpClient.interceptors(). add(new LoggingInterceptor());//這一句是給介面新增引數的,但是主要的還是new LoggingInterceptor() RestAdapter mRestAdapter = new RestAdapter.Builder().setEndpoint(url). setConverter(new GsonConverter(gson)).setLogLevel(RestAdapter.LogLevel.FULL) .setLog(new RestAdapter.Log() { @Overridepublic void log(String s) { } }).setClient(new OkClient(okHttpClient)).build();
上面寫註釋那一句就是新增一個方法,這個方法是我們自己寫的:
public class LoggingInterceptor implements Interceptor { private final Charset UTF8 = Charset.forName("UTF-8"); @Override public Response intercept(Chain chain) throws IOException { Request oldRequest = chain.request();//定義一個Request 請求 // 新增新的引數 HttpUrl.Builder authorizedUrlBuilder = oldRequest.httpUrl().newBuilder().scheme(oldRequest.httpUrl().scheme()) .host(oldRequest.httpUrl().host()) .addQueryParameter("欄位名字", "語言");//在這個請求裡面新增一個請求引數 // 新的請求 Request newRequest = oldRequest.newBuilder() .method(oldRequest.method(), oldRequest.body()) .url(authorizedUrlBuilder.build()) .build();//再定義一個新的Request請求,再把添加了請求引數的請求放到新的請求裡面來請求資料 RequestBody requestBody = newRequest.body(); String body = null; if (requestBody != null) { Buffer buffer = new Buffer(); requestBody.writeTo(buffer); Charset charset = UTF8; MediaType contentType = requestBody.contentType(); if (contentType != null) { charset = contentType.charset(UTF8); } body = buffer.readString(charset); } long startNs = System.nanoTime(); Response response = chain.proceed(newRequest); long tookMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs); ResponseBody responseBody = response.body(); String rBody = null; return response; } }
首先在這個方法裡面,我們需要定義一個Request 請求,但是這個請求不是執行請求資料,而是在這個請求裡面新增一個請求引數,然後再定義一個新的Request請求,再把添加了請求引數的請求放到新的請求裡面來請求資料,這樣所以通過這個方法請求的介面都會帶一個你新增的引數。
注:這個方法是我自己百度到的,屬於個人理解,說的不對的地方,歡迎大神指點。