1. 程式人生 > >Android用OKHttp進行資料請求時,統一給所有介面新增某個請求引數

Android用OKHttp進行資料請求時,統一給所有介面新增某個請求引數

        作為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() { @Override
public 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請求,再把添加了請求引數的請求放到新的請求裡面來請求資料,這樣所以通過這個方法請求的介面都會帶一個你新增的引數。

注:這個方法是我自己百度到的,屬於個人理解,說的不對的地方,歡迎大神指點。