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
または何かを動的にリクエストに追加できるようにするために何かを「サブクラス化」することは可能ですか?
それを実現するにはいくつかの方法があります。
デフォルトでは、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)
}
}
});
へのサポート 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);