1. 程式人生 > >Retrofit初探——請求引數

Retrofit初探——請求引數

0x00 請求引數

常見的Http請求,除了指定的請求地址,很多時候我們還需要加上一些請求引數,這些引數可能是固定的,也可能是動態新增的。在Retrofit中,我們該如何處理呢?這裡以GET方式中新增請求引數為例。

0x01 固定請求引數

這裡說的固定請求引數是指每次請求我們都在Url中新增相同的請求的引數。這種場景多出現在需要認證的情況,比如新增 Token 欄位等。

在之前的文章中,我們有提到在構建OkHttpClient物件的時候使用過 Interceptor ,在 Interceptor 的邏輯中,我們會重新建立一個 Request 物件,在這個物件中我們可以傳入一個 HttpUrl

,在這個物件中,我們可以傳入一些需要的請求引數。通過之前對 Interceptor 瞭解,我們應該知道,這裡做的操作是對所有的請求都有效的。這樣就可以完成我們為每個請求新增固定請求引數的目的。程式碼如下:

OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(new Interceptor() {
                    @Override
                    public okhttp3.Response intercept(Chain chain) throws
IOException { Request original = chain.request(); HttpUrl originalHttpUrl = original.url(); HttpUrl url = originalHttpUrl .newBuilder() .addQueryParameter("token"
, "I_am_user_token") .addQueryParameter("user_key", "I_am_user_user_key") .build(); Request request = original .newBuilder() .url(url) .build(); okhttp3.Response response = chain.proceed(request); return response; } }) .build();

0x02 動態請求引數

這個指我們在不同的請求中新增不同過的請求引數。比如,在請求使用者資訊的介面中我們可能需要傳入使用者ID,在請求記錄的介面中我們需要傳入起止時間等。由於這樣的引數是針對介面的,因此我們就需要在每一個介面做中處理。

  • @Query 新增一個請求引數

    // http://119.29.29.29/d?dn=ttdevs.vicp.com
    @GET("/d")
    public Call<ResponseBody> singleParams(@Query("dn") String domain);

    通過上面的方式,我們發出的請求就是:

    http://119.29.29.29/d?dn={domain}

  • @QueryMap 新增一組請求引數

    @GET("/record")
    public Call<ResponseBody> multiParams(@QueryMap(encoded = true) Map<String, String> options);

    上面我們發出的請求是:

    http://ttdevs.vicp.net/record?p1=v1&p2=v2

    這個這個例子中還可以看到,我們使用了一個引數:encoded = true,這個引數的意思是,對我們的引數進行URL
    Encode。

0x03 總結

通過上面的介紹,我們可以瞭解,如果新增我們的請求引數。當需要給每一個請求都新增相同引數時該如何封裝,把Retrofit打造成更適合我們使用的工具。

—— EOF ——