13

Map パラメータまたはオブジェクトを Retrofit POST リクエストに渡す際に問題があります。

squarekdubb labsのチュートリアル、およびこのスレッドに従っていますが、理解できませんでした。

動作する私の現在のコード:

public interface FacebookUser {
    @FormUrlEncoded
    @POST("/user/login-facebook")
    void login(
            @Field("fb_access_token") String fbAccessToken,
            @Field("os") String os,
            @Field("device") String device,
            @Field("os_version") String osVersion,
            @Field("app_version") String appVersion,
            @Field("online") String online,
            Callback<FacebookLoginUserResponse> callback
    );
}

そしてコード:

RestAdapter restAdapter = new RestAdapter.Builder()
                        .setServer(requestMaker.getUrl())
                        .build();

FacebookUser facebookUser = restAdapter.create(FacebookUser.class);
facebookUser.login(getFbAccessToken(),
getString(R.string.config_os),
Info.getAndroidId(getBaseContext()),
Build.VERSION.RELEASE,
        Info.getAppVersionName(getBaseContext()),
        "" + 1,
        new Callback<FacebookLoginUserResponse>() {
    @Override
    public void success(FacebookLoginUserResponse facebookLoginUserResponse, Response response) {
    }

    @Override
    public void failure(RetrofitError retrofitError) {
    }
});

このインターフェイスを使用しようとすると、サーバーからパラメーターが欠落しているというメッセージが表示されます。

public interface FacebookUser {
    @POST("/user/login-facebook")
    void login(
            @Body Map<String, String> map,
            Callback<FacebookLoginUserResponse> callback
    );
}

とマップ:

HashMap<String, String> map = new HashMap<String, String>();
    map.put("fb_access_token", getFbAccessToken());
    map.put("os", "android");
    map.put("device", Info.getAndroidId(getBaseContext()));
    map.put("os_version", Build.VERSION.RELEASE);
    map.put("app_version", Info.getAppVersionName(getBaseContext()));
    map.put("online", "" + 1);

質問: 何が間違っていますか? オブジェクトをリクエストに渡すにはどうすればよいですか?

4

3 に答える 3

34

さて、これを実装できるようになりました (バージョン 1.5.0)。

@FormUrlEncoded
@POST("/oauth/access_token")
void getToken(
    @FieldMap Map<String, String> params, 
    Callback<FacebookLoginUserResponse> callback
);
于 2014-04-08T19:02:29.983 に答える
16

Retrofit 2.0 では、次のようにする必要があります。

@FormUrlEncoded
    @POST(Constant.API_Login)
    Call<UserLoginPost> userLogin(@FieldMap Map<String, String> params);
于 2015-10-30T04:01:52.363 に答える
0

この機能は Retrofit 1.2.2 ではまだサポートされていませんが、この機能を使用して master ブランチから独自のバージョンをコンパイルするか、次のリリースを待つことができます。

https://github.com/square/retrofit/pull/390

アップデート:

Retrofit バージョン1.5.0で利用できます。(アントン・ゴロビンの回答参照)

于 2014-03-06T16:52:34.213 に答える