web-dev-qa-db-ja.com

APIリクエストにオプションのパラメーターを動的に追加する

Android APIと通信するRESTアプリがあります。

リクエストごとに、必須パラメーターに加えてオプションのパラメーターをアプリで追加できるようにします。

これをレトロフィットでどのように実装できますか?現在、すべてのパラメーターはインターフェースにハードコーディングされています。

@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または何かを動的にリクエストに追加できるようにするために何かを「サブクラス化」することは可能ですか?

22
David

それを実現するにはいくつかの方法があります。

  • デフォルトでは、Retrofitはすべてのnullクエリパラメータのnullを正しく処理するため、次のようなことができます。

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

Intの代わりにObjectを使用する場合、オプションのパラメーターに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)
                    }                      
                }
            });
    
44
Felix

へのサポート Map<String,String> 現在利用できます。 @QueryMap Map<String, String> params

http://square.github.io/retrofit/ から:

複雑なクエリパラメータの組み合わせには、マップを使用できます。

例:

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