有没有办法使用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);
为了完整起见,这里是你需要使用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();
你必须从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。
它绝对没有解释如何添加查询参数。它只是说明了如何进行拦截,但我只找到一个方法来添加页眉和OP和我想添加一个查询参数 –
可以修改请求链到你的需求,详见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
你对了。随着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.Builder
addInterceptor()
代替。
例如,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();
如果你成功地添加查询参数的拦截器,你能在你的问题或你自己的问题的响应添加代码? –