【问题标题】:Dynamically add optional parameters to API requests为 API 请求动态添加可选参数
【发布时间】:2013-12-21 08:18:18
【问题描述】:

我有一个与 REST API 通信的 Android 应用。

对于每个请求,我希望我的应用能够在强制参数之外添加可选参数。

如何使用 Retrofit 实现这一点?目前所有参数都在界面中硬编码:

@GET("/user/{id}/comments?position={pos}")  
void getComments(@Path("id") int id, @Query("pos") int pos, Callback<String> cb);

@GET("/user/{id}/likes?n={number}")  
void getLikes(@Path("id") int id, @Query("number") int number, Callback<String> cb);

/* etc */

是否有可能对RestAdapter 进行“子类化”或能够为我的请求动态添加可选参数的东西?

【问题讨论】:

    标签: android retrofit


    【解决方案1】:

    您有几种方法可以实现这一目标:

    • 默认情况下,Retrofit 会正确处理所有空查询参数的空值,因此您可以执行以下操作:

      @GET("/user/{id}/likes")  
      void getLikes(@Path("id") int id, @Query("n") Integer number, @Query("pos") Integer pos Callback<String> cb);
      

    如果您使用 Object 而不是 int,您可以使用 null 作为可选参数调用该方法:

        getLikes(1, null, null, cb); // to get /user/1/likes
        getLikes(1, 2, null, cb); // to get /user/1/likes?n=2
    
    • 通过使用 RequestInterceptor:

      RestAdapter.Builder builder= new RestAdapter.Builder()
      .setRequestInterceptor(new RequestInterceptor() {
                  @Override
                  public void intercept(RequestFacade request) {
                      request.addHeader("Accept", "application/json;versions=1");
                      if(/*condition*/){
                         request.addQueryParam(arg0, arg1)
                      }                      
                  }
              });
      

    【讨论】:

    • 另外,即将推出:支持 Map&lt;String, String&gt; 作为真正任意查询参数的 arg!
    • 如果你喜欢类型安全,你可以使用Integer 而不是Object
    • RequestInterceptor 根本不适合我。我做了一个单例包装类(所以我不需要总是创建一个新的 RequestInterceptor)。我重写了这样的拦截方法:@Override public void intercept(RequestFacade request) { request.addHeader("X-Mashape-Key: ", MASHAPE_API_KEY); request.addHeader("接受:", "application/json");在 AdapterBuilder 上,我像这样使用它: .setRequestInterceptor(RequestHeaderInjector.getInstance()) 它什么也不做。我不得不使用 Headers 注释来添加 2 个标题。虽然没有错误消息:(
    【解决方案2】:

    现在可以支持Map&lt;String,String&gt;。只需使用@QueryMap Map&lt;String, String&gt; params

    来自http://square.github.io/retrofit/

    对于复杂的查询参数组合,可以使用 Map。

    例子:

    @GET("/group/{id}/users")
    List<User> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
    

    【讨论】:

    • @FieldMap Map&lt;String, String&gt; fields; 在进行@POST 请求时也可用。
    猜你喜欢
    • 2016-04-13
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    相关资源
    最近更新 更多