【问题标题】:Retrofit POST with a json object containing parameters使用包含参数的 json 对象改造 POST
【发布时间】:2014-10-22 23:37:17
【问题描述】:

我正在使用 Retrofit 向我的服务器发送 POST 请求:

@POST("/login")
void login( @Body User user ,Callback<User> callback);

我的user 对象只有emailpassword 字段。

查看日志,我可以看到我的参数是以这种格式发送的:

D/Retrofit﹕{"email":"example@test.com","password":"asdfasdf"}

像这样发送我的参数需要做什么?

{"user" :  {"email":"example@test.com","password":"asdfasdf"} }

【问题讨论】:

  • 我也想创建相同的 jsonrequest 使用改造如下 { "params":{"email":"nilhr@gamil.com","password":"ni1234","firstName":" Nilesh","lastName":"Aher"}} 你能给我一段代码吗

标签: android json gson retrofit


【解决方案1】:

编辑:使用自定义JsonSerializer

public class CustomGsonAdapter {
    public static class UserAdapter implements JsonSerializer<User> {
        public JsonElement serialize(User user, Type typeOfSrc,
                                     JsonSerializationContext context) {
            Gson gson = new Gson();
            JsonElement je = gson.toJsonTree(user);
            JsonObject jo = new JsonObject();
            jo.add("user", je);
            return jo;
        }
    }
}

然后,在您的 API 客户端构建器上:

public static RestApiClient buildApiService() {
    Gson gson = new GsonBuilder()
            .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
            .registerTypeAdapter(User.class, new CustomGsonAdapter.UserAdapter())
            .create();

    RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint(API_URL)
            .setConverter(new GsonConverter(gson))
            .build();
    return restAdapter.create(MudamosApi.class);
}

【讨论】:

  • 您能否将您的代码粘贴到您实际进行登录调用的位置,您是如何传入用户对象的?
  • 嗨@Noble6,格式是我评论中的最后一行代码,但我学会了正确的方法,使用自定义gson转换器square.github.io/retrofit/#restadapter-configuration但感谢您的提问!
  • @KayanAlmeida 我想做同样的事情。您是否有任何示例代码说明您是如何使用自定义转换器做到这一点的?
  • @KayanAlmeida 非常棒。谢谢!
  • 这绝对是要走的路!谢谢
【解决方案2】:

解决你的问题最简单的方式是创建一个RequestPOJO类,例如:

文件用户.java:

public class User{
    public String email;
    public String password;
}

文件 LoginRequestPojo.java:

public class LoginRequestPojo{
    public User user;

    public LoginRequestPojo(User user){
        this.user = user;
    }
}

并且,在您的改造 2 请求中:

@POST("/login")
void login( @Body LoginRequestPojo requestPojo, Callback<User> callback);

最后,您的请求正文:

{"user":{"email":"someone@something.com","password":"123123"}}

【讨论】:

  • 我以前做过,如果你在版本与你的相似之前检查我的答案,但这不是推荐的方式,因为它创建了一个几乎什么都不做的class。更好的方法是将所有与 JSON 相关的处理集中在 GsonAdapter 中,或者也可以使用带有注释的 Jackson! :)
  • 你不是创建一个类来解决问题吗?为什么解决相同问题的更复杂的类是更好的方法?
猜你喜欢
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
相关资源
最近更新 更多