有没有办法使用Retrofit 2为每个请求添加查询参数?

问题描述:

我需要为每个由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

如果你成功地添加查询参数的拦截器,你能在你的问题或你自己的问题的响应添加代码? –

为了完整起见,这里是你需要使用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

你必须从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方法。我认为你应该把它添加到你的问题 –

现在改造具有释放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); 

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();