webentwicklung-frage-antwort-db.com.de

So übergeben Sie Map <String, String> -Parameter oder -Objekt an POST Anfrage per Retrofit?

Ich habe ein Problem mit der Übergabe von Map-Parametern oder -Objekten an Retrofit POST request.

Ich folge square , kdubb labs tutorials und diesem Thread und ich konnte es nicht herausfinden.

Mein aktueller Code, der funktioniert:

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
    );
}

und Code:

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) {
    }
});

Wenn ich versuche, diese Schnittstelle zu verwenden, erhalte ich vom Server, dass Parameter fehlen:

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

und Karte:

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);

Fragen: Was ist los? Wie kann ich ein Objekt an eine Anfrage übergeben?

10
piobab

Nun, jetzt können wir dieses Ding implementieren (Version 1.5.0). 

@FormUrlEncoded
@POST("/oauth/access_token")
void getToken(
    @FieldMap Map<String, String> params, 
    Callback<FacebookLoginUserResponse> callback
);
30
Anton Holovin

In Retrofit 2.0 müssen Sie folgendermaßen vorgehen:

@FormUrlEncoded
    @POST(Constant.API_Login)
    Call<UserLoginPost> userLogin(@FieldMap Map<String, String> params);
12
Joolah

Diese Funktion wird von Retrofit 1.2.2 immer noch nicht unterstützt. Sie können jedoch mit dieser Funktion Ihre eigene Version aus dem Hauptzweig kompilieren oder auf die nächste Version warten.

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

Aktualisieren:

Es ist in der Retrofit-Version verfügbar 1.5.0 ! (Ref Anton Golovin Antwort)

0
Felix