将Map参数或对象传递给Retrofit 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);
问题: 这有什么不对? 如何将对象传递给请求?
答案 0 :(得分:31)
好吧,现在我们可以实现这个东西(版本1.5.0)。
@FormUrlEncoded
@POST("/oauth/access_token")
void getToken(
@FieldMap Map<String, String> params,
Callback<FacebookLoginUserResponse> callback
);
答案 1 :(得分:13)
在改造2.0中你必须这样做:
@FormUrlEncoded
@POST(Constant.API_Login)
Call<UserLoginPost> userLogin(@FieldMap Map<String, String> params);
答案 2 :(得分:0)
Retrofit 1.2.2仍然不支持此功能,但您可以使用此功能从主分支编译自己的版本,或等待下一个版本。
https://github.com/square/retrofit/pull/390
更新
可在改装版 1.5.0 中使用! (参考 Anton Golovin 回答)