Retrofit 2를 사용하여 모든 요청에 쿼리 매개 변수를 추가하는 방법이 있습니까?
Retrofit 2.0.0-beta2 라이브러리의 모든 요청에 쿼리 매개 변수를 추가해야합니다. Retrofit 1.9에 대한 이 솔루션 을 찾았 지만 RequestInterceptor
최신 라이브러리 버전 을 추가하는 방법은 무엇입니까?
내 인터페이스 :
@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-Interceptor를 사용하여 모든 Retrofit 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();
이제 Retrofit에는 릴리스 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);
당신은 전환 할 필요가 Interceptor
에서 OkHttp
. 만들기 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()
. 자세한 내용은 설명서 를 참조하십시오.
In 3.2.0
and higher you should use addInterceptor()
in OkHttpClient.Builder
instead.
For example, with 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();
A lot of these answers are similar, but an issue I came accross is the chaining of functions inside the Interceptor
which led it to fail for me. Changes cannot be made directly to a url according to the linked video. Rather, a copy of the url must be made and then reassigned back to the original url as shown below:
{
public method(){
final String api_key = "key";
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
HttpUrl httpUrl = original.url();
HttpUrl newHttpUrl = httpUrl
.newBuilder()
.addQueryParameter("api_key", api_key)
.build();
Request.Builder requestBuilder = original
.newBuilder()
.url(newHttpUrl);
Request request = requestBuilder
.build();
return chain.proceed(request);
}
}).build();
retrofit = new Retrofit.Builder()
.baseUrl("https://base.url.ext/")
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
While the functions called are identical to the first answer, this answer partitions the function calls out. Namely, the original url as well as the new url are stored in separate local variables. This prevents overwriting the original url until you want the OkHttpClient
to do so.
ReferenceURL : https://stackoverflow.com/questions/32948083/is-there-a-way-to-add-query-parameter-to-every-request-with-retrofit-2
'programing' 카테고리의 다른 글
SSH -X“경고 : 신뢰할 수없는 X11 전달 설정 실패 : xauth 키 데이터가 생성되지 않음” (0) | 2021.01.17 |
---|---|
for 루프에서 생성 된 Pandas 데이터 프레임 추가 (0) | 2021.01.17 |
BigDecimal, 정밀도 및 스케일 (0) | 2021.01.17 |
void main과 int main의 차이점은 무엇입니까? (0) | 2021.01.17 |
소켓 수락- "열린 파일이 너무 많습니다" (0) | 2021.01.17 |