2014-01-11 7 views
10

У меня возникла проблема с передачей параметров или объекта карты для обновления запроса POST.Как передать карту <String, String> параметры или объект на запрос POST через Retrofit?

Я следую 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

Update:

Она доступна в Retrofit версии 1.5.0! (ref Anton Golovin ответ)

12

В модификации 2.0 вы должны сделать так:.

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