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=default/homepage")
Observable<Response<Exercise>> getDataList(@Query("page") int page, @Query("user_id") int userId);

两个接口,区别就在于有没有『user_id』参数。

这样做,总感觉有点罗嗦,体现不出Retrofit的优越性。有没有更好的方法呢?当然有,那就是动态参数(其实很简单)。

上面的两个接口合并为一个:

@GET("index.php?r=default/homepage")
Observable<Response<Exercise>> getDataList(@Query("page") int page,@Query("user_id") Integer userId);

使用

登录:

APIWrapper.getInstance().getDataList(mCurrentPage, 10);

未登录:

APIWrapper.getInstance().getDataList(mCurrentPage, null);

Retrofit运行null值参数,如果在实际调用的时候传一个null, 系统也不会出错,会把这个参数当作没有。

对于参数名称不固定的情况也可以使用Map

@GET("applist/apps/detail")
Call<ResponsePojo> getDetail(@QueryMap Map<String, String> param);

当然,还可以支持固定参数与动态参数的混用

@GET("applist/apps/detail?type=detail")
Call<ResponsePojo> getDetail(@Query("appid") String appid);
修改Header

固定添加Header

@Headers("Accept-Encoding: application/json")

@GET("applist/apps/detail?type=detail")
Call<ResponsePojo> getDetail(@Query("appid") String appid);

动态添加Header

@Headers("Accept-Encoding: application/json")

@GET("applist/apps/detail?type=detail")
Call<ResponsePojo> getDetail(@Header ("Accept-Encoding") String appid);

多个Header

@Headers({
    "X-Foo: Bar",
    "X-Ping: Pong"
  })
@GET("applist/apps/detail?type=detail")
Call<ResponsePojo> getDetail(@Header ("Accept-Encoding") String appid);

固定与动态的Header的混合

@Headers("Accept-Encoding: application/json")

@GET("applist/apps/detail?type=detail")
Call<ResponsePojo> getDetail(@Header ("Location") String appid);

以上用法同样适用于Post请求。

That’s all.

或许你对这个也感兴趣:

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

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
要拦截 Retrofit参数,可以通过自定义 OkHttp 的拦截器来实现。以下是一个简单的拦截器示例: ```java public class CustomInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); if (request.method().equals("POST")) { // 获取请求体 RequestBody requestBody = request.body(); if (requestBody instanceof FormBody) { // 构造新的请求体 FormBody.Builder newFormBodyBuilder = new FormBody.Builder(); FormBody oldFormBody = (FormBody) requestBody; for (int i = 0; i < oldFormBody.size(); i++) { // 获取原请求体中的参数名和参数值 String name = oldFormBody.name(i); String value = oldFormBody.value(i); // 对参数值进行处理 String newValue = processParamValue(value); // 添加到新的请求体中 newFormBodyBuilder.add(name, newValue); } // 构造新的请求 Request newRequest = request.newBuilder() .post(newFormBodyBuilder.build()) .build(); // 发送新的请求 return chain.proceed(newRequest); } } // 不需要拦截,直接发送原请求 return chain.proceed(request); } // 对参数值进行处理的方法 private String processParamValue(String value) { // TODO: 在这里对参数值进行处理 return value; } } ``` 在 Retrofit 的初始化中,添加这个拦截器即可: ```java OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new CustomInterceptor()) .build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://example.com/") .client(client) .build(); ``` 以上示例仅演示了如何拦截 POST 请求中的参数,并对参数值进行处理。如果需要拦截 GET 请求或其他类型的请求,或者需要对参数名进行处理,都可以修改拦截器的代码来实现。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值