Retrofit2.0添加公参

在实际项目中,对于有需要统一进行公共参数添加的网络请求,可以使用下面的代码来实现:

  RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint(ctx).setRequestInterceptor(new RequestInterceptor() {
                @Override
                public void intercept(RequestFacade request) {
                    request.addQueryParam("publicParams", "1");
                }
            }).setConverter(new BaseConverter())
            .build();

在RestAdapter的实例化对象的时候,为其指定一个RequestInterceptor接口的实现类即可,在该类中,可以对请求体的相关参数进行设置,如addHeader、addQueryParam等。

不过遗憾的是Retrofit2.0已经没有了该类,该怎么做呢?通过Interceptor实现。

Interceptor是拦截器, 在发送之前, 添加一些参数, 或者获取一些信息。

  /**
 * 封装公共参数(Key和密码)
 * <p>
 */
public class CommonInterceptor implements Interceptor {
private final String mApiKey;
private final String mApiSecret;

public CommonInterceptor(String apiKey, String apiSecret) {
    mApiKey = apiKey;
    mApiSecret = apiSecret;
}

@Override public Response intercept(Interceptor.Chain chain) throws IOException {
    String marvelHash = ApiUtils.generateMarvelHash(mApiKey, mApiSecret);
    Request oldRequest = chain.request();

    // 添加新的参数
    HttpUrl.Builder authorizedUrlBuilder = oldRequest.url()
            .newBuilder()
            .scheme(oldRequest.url().scheme())
            .host(oldRequest.url().host())
            .addQueryParameter(MarvelService.PARAM_API_KEY, mApiKey)
            .addQueryParameter(MarvelService.PARAM_TIMESTAMP, ApiUtils.getUnixTimeStamp())
            .addQueryParameter(MarvelService.PARAM_HASH, marvelHash);

    // 新的请求
    Request newRequest = oldRequest.newBuilder()
            .method(oldRequest.method(), oldRequest.body())
            .url(authorizedUrlBuilder.build())
            .build();

    return chain.proceed(newRequest);
  }
}

Okhttp3使用了装饰者模式, 使用Builder添加Interceptor。

CommonInterceptor commonInterceptor = new CommonInterceptor(
            "key", "Secret");

OkHttpClient client = new OkHttpClient.Builder()
            .addInterceptor(commonInterceptor)
            .build();

 // 适配器
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("url")             
    .addConverterFactory(GsonConverterFactory.create()
    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
    .client(client)
    .build();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,841评论 18 139
  • 概述 随着Google对HttpClient 摒弃,和Volley的逐渐没落,OkHttp开始异军突起,而Retr...
    SnowDragonYY阅读 917评论 0 1
  • 概述 随着Google对HttpClient 摒弃,和Volley的逐渐没落,OkHttp开始异军突起,而Retr...
    BoBoMEe阅读 80,354评论 13 144
  • 本博客为作者原创,如需转载请注明原博客出处:WONDER'TWO 0X00 写在前面 相信做过And...
    一只酸奶牛哇阅读 4,383评论 9 34
  • 遇见腾冲,完全是个意外。 原本安安心心在瑞丽吃着干巴发着呆,同行的杨旭同学从朋友圈里发现了李雯琪同学在腾冲,就决定...
    夔牛神阅读 303评论 0 0