2014-01-11 24 views
10

我有一個傳遞Map參數或對象來改進POST請求的問題。如何通過Retrofit將Map <String,String>參數或對象傳遞給POST請求?

我遵循square,kdubb labs教程和this thread,我無法弄清楚。

我當前的代碼其中工程:

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

問題: 這是什麼錯誤? 如何傳遞對象來請求?

回答

29

那麼,現在我們可以實現這個東西(版本1.5.0)。

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

** RestAdapter restAdapter =新RestAdapter.Builder()對setEndpoint( 「http://192.168.101.55/test」)。 build(); **應該正常工作?它是(版本1.5.0)對不對? –

+1

@LOG_TAG肯定。它應該工作。 –

+1

爲什麼這不在改造文件? – jvrodrigues

0

Retrofit 1.2.2不支持此功能,但您可以使用此功能從主分支編譯自己的版本,或等待下一個版本。

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

更新:

它在改裝版本1.5.0可用! (參考Anton Golovin答案)

12

在改造2.0你必須做的是這樣的:。

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