Retrofit2和OkHttp3单一请求拦截器

时间:2016-02-18 17:33:03

标签: android retrofit okhttp retrofit2 okhttp3

从OkHttp v3开始,OkHttpClient是不可变的,拦截器的列表也是如此。

从Retrofit 2.0-beta3开始,它取决于OkHttp v3。

在我的应用中,我需要解析具有“a = 1& b = 2& c = 3”格式的Google Analytics Campain refferer密钥,并将其附加到注册请求网址。

使用以前版本的改造,通过添加

很容易
retrofit.client().interceptors().add(0, chain -> {
    final Request httpRequest = chain.request();
    return chain.proceed(httpRequest.newBuilder().url(httpRequest.httpUrl().toString() + "&" + request.getUtmParams()).build());
});

执行呼叫前和

retrofit.client().interceptors().remove(0);

通话结束后继续。

无法弄清楚如何使用新版本实现相同的行为。 请帮忙。

UPD 1.目标是控制单个请求的请求URL。将字符串附加到末尾只是一个示例。使用@QueryMap是一个选项,但它需要解析我试图避免的参数字符串。

3 个答案:

答案 0 :(得分:0)

使用查询地图。

public interface ApiService {
@GET("YOUR_BASE_URL")
Call<Login> authenticate(@Query("a") String a, @Query("b") String b,@Query("c") String c);
}

答案 1 :(得分:0)

您可以安装拦截器一次,然后使用标头触发拦截器。有关详细信息,请参阅this post

答案 2 :(得分:-1)

取决于您的请求方法,但在这里我使用GET

//您也可以使用地图查询来获得相同的结果

public interface ApiService {

    @GET("api/{a}/{b}/{c}")
    Call<Login> authenticate(@Path("a") String a, @Path("b") String password, @Path("c") String c);
}

创建EntityObject

public EntityObject {

   Public String a;

   Public String b;

   Public String c;
}

使用改造来使用您的参数发出请求

private void makeRemoteRequest(String a, String b, String c){

  Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

 ApiInterface mService = retrofit.create(ApiService.class);

Call<Login> mService = mService.authenticate(a, b, c);
    mService.enqueue(new Callback<Login>() {
        @Override
        public void onResponse(Call<Login> call, Response<Login> response) {


        }

        @Override
        public void onFailure(Call<Login> call, Throwable t) {

        }
    });
}