【问题标题】:How to pass Map<String, String> parameters or object to POST request via Retrofit?如何通过 Retrofit 将 Map<String, String> 参数或对象传递给 POST 请求?
【发布时间】:2014-01-30 13:56:00
【问题描述】:

我在将 Map 参数或对象传递给 Retrofit POST 请求时遇到问题。

我关注了squarekdubb 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);

问题: 有什么问题? 如何将对象传递给请求?

【问题讨论】:

    标签: java android api retrofit


    【解决方案1】:

    Retrofit 1.2.2 仍然不支持此功能,但是您可以使用此功能从 master 分支编译您自己的版本或等待下一个版本。

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

    更新:

    在改造版本 1.5.0 中可用! (参考 Anton Golovin 回答)

    【讨论】:

      【解决方案2】:

      好了,现在我们可以实现这个东西了(版本 1.5.0)。

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

      【讨论】:

      • RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint("192.168.101.55/test").build(); 应该可以正常工作吧?它适用于(1.5.0 版)对吧?
      • 为什么这不在改造文档中?
      • 有没有办法给 FieldMap 起个名字?我试过@FieldMap("transactionDetails") 但编译错误。有什么想法吗?
      • @royherma 你有没有找到一种方法来给字段映射名称?我希望一个特定的字段是一张地图
      【解决方案3】:

      在改造 2.0 中,您必须这样做:

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

      【讨论】:

        猜你喜欢
        • 2013-05-08
        • 1970-01-01
        • 2015-11-20
        • 1970-01-01
        • 1970-01-01
        • 2023-02-24
        • 2021-06-26
        • 2013-08-19
        • 2014-02-11
        相关资源
        最近更新 更多