2015-10-05 61 views
35

我需要爲每個由Retrofit 2.0.0-beta2庫發出的請求添加一個查詢參數。我發現this solution用於改造1.9,但如何添加在最新的庫版本RequestInterceptor有沒有辦法使用Retrofit 2爲每個請求添加查詢參數?

我的界面:

@GET("user/{id}") 
Call<User> getUser(@Path("id")long id); 

@GET("users/") 
Call<List<User>> getUser(); 

客戶:

Retrofit retrofit = new Retrofit.Builder() 
        .baseUrl(BASE_URL) 
        .addConverterFactory(GsonConverterFactory.create()) 
        .client(CLIENT) // custom OkHTTP Client 
        .build(); 
service = retrofit.create(userService.class); 
+0

如果你成功地添加查詢參數的攔截器,你能在你的問題或你自己的問題的響應添加代碼? –

回答

66

爲了完整起見,這裏是你需要使用OkHttp攔截參數添加到每個改造2.x的要求的完整代碼:

OkHttpClient client = new OkHttpClient(); 

client.interceptors().add(new Interceptor() { 
    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Request request = chain.request(); 
     HttpUrl url = request.url().newBuilder().addQueryParameter("name","value").build(); 
     request = request.newBuilder().url(url).build(); 
     return chain.proceed(request); 
    } 
}); 

Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl("...") 
     .client(client) 
     .build(); 
+13

'httpUrl()'方法改爲'網址()'在'3.2.0'最新版本的OkHttp – Singed

+8

'攔截器()返回''不可改變的List'。相反,請在'OkHttpClient.Builder'中使用'addInterceptor()'。 –

+1

添加的參數將在GET中設置,如果您需要使用其他請求類型,則可能會出現問題。 – tryp

4

你必須從OkHttp切換到Interceptor。創建一個OkHttpClient,添加Interceptor給它的通客戶端的改造Builder

OkHttpClient client = new OkHttpClient(); 
client.interceptors().add(new Interceptor() { 
    @Override 
    public Response intercept(Chain chain) throws IOException { 
     ... 
    } 
}); 

Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl("...") 
     .client(client) 
     .build(); 

然後,您可以使用chain.request().newBuilder()調整請求以滿足您的需求。有關詳細信息,請參閱documentation

+3

它絕對沒有解釋如何添加查詢參數。它只是說明了如何進行攔截,但我只找到一個方法來添加頁眉和OP和我想添加一個查詢參數 –

+3

可以修改請求鏈到你的需求,詳見OkHttp文檔。 (例如:。。。。。chain.proceed(chain.request()newBuilder()URL(chain.request()httpUrl()newBuilder()addQueryParameter( 「姓名」, 「值」)建立())構建。 ()); // http://square.github.io/okhttp/javadoc/com/squareup/okhttp/HttpUrl.Builder.html#addQueryParameter-java.lang.String-java.lang.String-) – sebastian

+0

你對了。隨着API的變化,很難找到如何添加查詢參數,所以你的解決方案沒有幫助我,直到我發現httpurl也有一個newBuilder方法。我認爲你應該把它添加到你的問題 –

5

現在改造具有釋放2.0.0這是我的解決方案:

OkHttpClient client = new OkHttpClient.Builder() 
         .addInterceptor(new Interceptor() { 
          @Override 
          public Response intercept(Chain chain) throws IOException { 

           String uid = "0"; 
           long timestamp = (int) (Calendar.getInstance().getTimeInMillis()/1000); 
           String signature = MD5Util.crypt(timestamp + "" + uid + MD5_SIGN); 
           String base64encode = signature + ":" + timestamp + ":" + uid; 
           base64encode = Base64.encodeToString(base64encode.getBytes(), Base64.NO_WRAP | Base64.URL_SAFE); 

           Request request = chain.request(); 
           HttpUrl url = request.url() 
             .newBuilder() 
             .addQueryParameter("pageSize", "2") 
             .addQueryParameter("method", "getAliasList") 
             .build(); 

           request = request 
             .newBuilder() 
             .addHeader("Authorization", "zui " + base64encode) 
             .addHeader("from_client", "ZuiDeer") 
             .url(url) 
             .build(); 

           Response response = chain.proceed(request); 

           return response; 
          } 
         }).build(); 


       Retrofit retrofit = new Retrofit.Builder() 
         .baseUrl(ApiConstants.API_BASE_URL) 
         .client(client) 
         .addConverterFactory(GsonConverterFactory.create()) 
         .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
         .build(); 

       mRestfulService = retrofit.create(RestfulService.class); 
1

3.2.0和更高的你應該使用OkHttpClient.BuilderaddInterceptor()代替。

例如,Retrolambda

HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor() 
     .setLevel(HttpLoggingInterceptor.Level.BASIC); 

Interceptor clientInterceptor = chain -> { 
    Request request = chain.request(); 
    HttpUrl url = request.url().newBuilder().addQueryParameter("name", "value").build(); 
    request = request.newBuilder().url(url).build(); 
    return chain.proceed(request); 
}; 

OkHttpClient client = new OkHttpClient.Builder() 
     .addNetworkInterceptor(clientInterceptor) 
     .addInterceptor(loggingInterceptor) 
     .build(); 

Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl(BASE_URL) 
     .addConverterFactory(GsonConverterFactory.create()) 
     .client(client) 
     .build(); 
相關問題