Retrofit2.0 公共参数(固定参数)

请先阅读:

Retrofit 动态参数(非固定参数、非必须参数)(Get、Post请求)

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

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


有时候你找到了一条线,就能顺着线找到更多。

BasicParamsInterceptor - 为 OkHttp 请求添加公共参数

背景

在 Android Http API 请求开发中经常遇到这样的需求:每一次请求带上一个或者多个固定不变的参数,例如:

  • 设备唯一标识:device_id = 7a4391e28f309c21
  • 业务唯一标识:uid = 2231001
  • 平台类型:platform = android
  • 客户端版本号:version_code = 6

这些参数是每一次发生请求都需要的,我们姑且称他们为公共参数(或者基础参数)。公共参数一般以 header line、url query 或者 post body(较少) 这些形式插入请求。

实现

如果使用 OkHttp 作为 http request client, 这件事情就变得简单多了。OkHttp 提供了强大的拦截器组件 (Interceptor):

Interceptors are a powerful mechanism that can monitor, rewrite, and retry calls.

也就是说,OkHttp 的拦截器功能之一就是对将要发出的请求进行拦截、改造然后再发出。这正是我们想要的。BasicParamsInterceptor 实现了 okhttp3.Interceptor 接口。

实现 public Response intercept(Chain chain) throws IOException 方法。使用 Builder 模式,暴露以下接口:

addParam(String key, String value)

post 请求,且 body type 为 x-www-form-urlencoded 时,键值对公共参数插入到 body 参数中,其他情况插入到 url query 参数中。

addParamsMap(Map paramsMap)

同上,不过这里用键值对 Map 作为参数批量插入。

addHeaderParam(String key, String value)

在 header 中插入键值对参数。

addHeaderParamsMap(Map headerParamsMap)

在 header 中插入键值对 Map 集合,批量插入。

addHeaderLine(String headerLine)

在 header 中插入 headerLine 字符串,字符串需要符合 -1 != headerLine.indexOf(“:”) 的规则,即可以解析成键值对。

addHeaderLinesList(List headerLinesList)

同上,headerLineList: List 为参数,批量插入 headerLine。

addQueryParam(String key, String value)

插入键值对参数到 url query 中。

addQueryParamsMap(Map queryParamsMap)

插入键值对参数 map 到 url query 中,批量插入。

示例

使用 Buider 模式创建 Interceptor 对象,然后调用 OkHttp 的 addInterceptor(Interceptor i) 方法将 interceptor 对象添加至 client 中:

BasicParamsInterceptor basicParamsInterceptor =
        new OkPublicParamsInterceptor.Builder()
                .addHeaderParam("device_id", DeviceUtils.getDeviceId())
                .addParam("uid", UserModel.getInstance().getUid())
                .addQueryParam("api_version", "1.1")
                .build();
OkHttpClient client = new OkHttpClient.Builder()
        .addInterceptor(basicParamsInterceptor)
        .build();

TODO

  • 自动时间戳公共参数的支持
  • 动态参数的支持(例如登录后插入服务器返回的 uid)

    源码

源码与引用:https://github.com/jkyeo/okhttp-basicparamsinterceptor


时间: 2024-09-29 23:05:38

Retrofit2.0 公共参数(固定参数)的相关文章

Retrofit 动态参数(非固定参数 非必须参数)(Get Post请求)

关键词:Retrofit 动态参数.非固定参数.非必须参数 有如下场景: 请求数据时: 1. 用户未登录时,不带参数userId: 2. 登录时带上参数userId. 如下接口: @GET("index.php?r=default/homepage") Observable<Response<Exercise>> getDataList(@Query("page") int page); @GET("index.php?r=defa

JDK5.0新特性-可变参数

可变参数: 格式 类型... 变量 本质上这个参数是一个数组. 优点:1.传参数时可以传递数组,也可以传递多个值. 2.可以不传递值. Arrays.asList()可以将数组转换成List集合. 注意:得到的是一个固定长度的List集合. 原因:是因为数组长度是固定的,这个集合是由数组转换成的. 为什么要将数组转换成集合? 集合中提供更丰富的操作. int[] arr = { 1, 2, 3 }; List list = Arrays.asList(arr); System.out.print

python-函数-非固定参数

非固定参数: 非固定参数的作用:可以传不固定个数的参数进去,为以后的扩展准备. 在函数中,加了名字的非固定函数输出是会显示为字典形式,没有加名字的非固定函数输出时会显示为元组形式. def sud(name,age,*args,**kwargs):#*args 会把多传入的参数变成一个元组形式显示:**kwargs 会把多传入的参数变成一个字典的形式显示 print(name,age,args,kwargs) returnsud("zhangsan",20,"beijing&

[ActionScript 3.0] AS3 获取函数参数个数

1 function createFunction(param1:String,param2:String,param3:int=0):void 2 { 3 trace(arguments.length);//arguments.length表示实参个数 4 } 5 trace(arguments.length);//输出0,说明arguments.length只在函数体内有效 6 trace(createFunction.length);//输出3,说明createFunction.lengt

Python直接用字典数组导入到函数的非固定参数

正好是学logging模块的时候遇到的.代码是这样的: logging.basicConfig(filename='test.log',                     level=logging.DEBUG,                     format='%(name)s %(asctime)s %(module)s-%(lineno)d [%(levelname)s]:%(message)s',                     datefmt='%Y-%m-%d %

默认参数,不固定参数 *args,**kwargs

默认参数 默认参数就是定义参数的时候,给形参赋值. 自己看 def test(x,y=3): print(x) print(y) test(1) test(1,y=5) test(1,5) 1,特点,调用函数的时候,默认参数非必须传递 2,用途, 可以提前把一些值固定住,例如默认安装值 固定链接数据库的端口号   不固定参数 #args:接受N个位置参数,转换成元组 实例1 def test(*args): print(args) #args:接受N个位置参数,转换成元组 test(32,23,

MySQL 8.0 首个自适应参数横空出世

MySQL 8.0 首个自适应参数横空出世MySQL 8.0推出一个号称可以自适应服务器的参数,保证在各种不同的服务器.虚拟机.容器下自动适配服务器资源.本文将为大家详细介绍该参数. 作者 李春·沃趣科技联合创始人&高级MySQL数据库专家出品 沃趣科技 |什么是自适应参数MySQL8.0推出一个号称可以自适应服务器的参数,保证在各种不同的服务器.虚拟机.容器下自动适配服务器资源,让我们一起来看看到底它能做到什么地步. |自适应参数是如何设置和适应变化的可以设置参数 innodb_dedicat

22、函数不固定参数

 不固定参数*args放到元祖里面 关键字参数是放到字典里面 也可以放混合必填参数 原文地址:https://www.cnblogs.com/cwl-bj/p/9625589.html

运行所选代码生成器时出错:“值-1超出了可接受的[0,2147483647]范围。参数名称:value”

目录 0.事故现场: 1.解决方案: 2.参考: 0.事故现场: 在使用vs2019添加mvc控制器的时候,报如下错误: 运行所选代码生成器时出错:"值-1超出了可接受的[0,2147483647]范围.参数名称:value" 1.解决方案: 关闭打开中的web.config,然后再新建控制器: 2.参考: https://developercommunity.visualstudio.com/content/problem/626755/error-running-the-selec