2014-01-11 6 views
10

Ich habe ein Problem mit der Übergabe von Map Parametern oder Objekt an Retrofit POST-Anfrage.Wie übergeben Sie Map <String, String> -Parameter oder -Objekt an eine POST-Anfrage über Retrofit?

Ich folge square, kdubb labs Tutorials und this 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 ich vom Server empfangen zu verwenden, die 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 falsch? Wie kann ich Objekt an Anfrage übergeben?

Antwort

29

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

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

** RestAdapter restAdapter = new RestAdapter.Builder() setEndpoint ("http://192.168.101.55/test"). build(); ** sollte funktionieren? es ist für (Version 1.5.0) richtig? –

+1

@LOG_TAG sicher. Es sollte funktionieren. –

+1

Warum ist das nicht in der Nachrüstdokumentation? – jvrodrigues

0

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 Master-Zweig kompilieren oder auf die nächste Version warten.

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

Update:

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

12

In Retrofit 2.0 Sie haben diese Art und Weise zu tun.

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