How to pass Map<String, String> parameters or object to POST request via Retrofit?
Question
I have a problem with passing Map parameters or object to Retrofit POST request.
I follow square, kdubb labs tutorials and this thread and I couldn't figure it out.
My current code which works:
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
);
}
and 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) {
}
});
When I try to use this interface I receive from server that parameters are missing:
public interface FacebookUser {
@POST("/user/login-facebook")
void login(
@Body Map<String, String> map,
Callback<FacebookLoginUserResponse> callback
);
}
and map:
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);
Questions: What is it wrong? How can I pass object to request?
Solution
Well, now we can implement this thing (version 1.5.0).
@FormUrlEncoded
@POST("/oauth/access_token")
void getToken(
@FieldMap Map<String, String> params,
Callback<FacebookLoginUserResponse> callback
);
OTHER TIPS
In retrofit 2.0 you have to do this way:
@FormUrlEncoded
@POST(Constant.API_Login)
Call<UserLoginPost> userLogin(@FieldMap Map<String, String> params);
This feature is still not supported by the Retrofit 1.2.2, however you can compile your own version from the master branch with this feature or wait for the next release.
https://github.com/square/retrofit/pull/390
Update:
It's available in Retrofit version 1.5.0 ! (ref Anton Golovin answer)