改造 - POST请求的字段作为POJO的包名发送

时间:2016-05-06 11:00:16

标签: java android json retrofit pojo

我有一个POJO,我想使用Retrofit 2.0.2发送到我的后端服务器。这是一个简单LoginRequest loginIdpassword。这是POJO课程:

public class LoginRequest {

    private String loginId;
    private String password;

    public void setLoginId(String loginId) {
        this.loginId = loginId;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getLoginId() {
        return loginId;
    }

    public String getPassword() {
        return password;
    }
}

服务器应该将此数据作为原始JSON获取,它看起来像这样:

{"loginId":"userLoginId","password":"userPassword"}

Retrofit的初始化如下:

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .client(httpClient.build())
            .build();

如您所见,我使用GSON进行转换。

我的POST方法代码如下:

@FormUrlEncoded
@Headers(ServiceHandler.REQUEST_HEADER_TITLE + ServiceHandler.REQUEST_HEADER_VALUE_LOGIN)
@POST(ServiceHandler.ENDPOINT)
Call<LoginResponse> getUser(@Field("loginRequest") String loginRequest);

我开始与这一行建立联系:

Call<LoginResponse> call = service.getUser(loginRequest);

据我所知,Retrofit使用转换器将POJO转换为JSON以获取请求,将JSON转换为POJO以进行响应。所以我认为它会将我的类转换为上面的JSON格式。

然而,后端服务器的响应告诉我该字段的格式无效。当我查看OkHTTP记录器时,我发现:

05-06 06:27:16.569 14103-14434/my.package.name D/OkHttp: --> POST http://my.web/page.php http/1.1
05-06 06:27:16.569 14103-14434/my.package.name D/OkHttp: Content-Type: application/x-www-form-urlencoded
05-06 06:27:16.569 14103-14434/my.package.name D/OkHttp: Content-Length: 79
05-06 06:27:16.569 14103-14434/my.package.name D/OkHttp: MyHeader: login
05-06 06:27:16.569 14103-14434/my.package.name D/OkHttp: loginRequest=my.package.name.Server.Data.Login.LoginRequest%40189d3779
05-06 06:27:16.569 14103-14434/my.package.name D/OkHttp: --> END POST (79-byte body)

在第5行中,您可以看到问题:在发送请求之前,Retrofit不会将我的数据序列化为JSON。所有我都知道我的对象,其中的每个字段都由设置者初始化。

是什么原因?我的代码遗漏了什么吗?

1 个答案:

答案 0 :(得分:0)

如果您想直接发送,可以发送LoginRequest作为正文。

Call<LoginResponse> getUser(@Body("loginRequest") LoginRequest body);

但是如果你想使用FormUrlEncoded,你有两个选择: 要么你可以发送所有的params&amp;值作为单独的字段。

Call<LoginResponse> getUser(@Field("loginId") String loginId, @Field("password") String password);

或者您可以使用HashMap添加所有参数和值,并将其作为FieldMap发送。

Call<LoginResponse> getUser(@FieldMap Map<String, String> fields);


HashMap<String, String> map = new HashMap<String, String>;
map.put("loginId", loginId);
map.put("password", password);
Call<LoginResponse> call = service.getUser(map);

关于

的问题的答案
  

据我所知,Retrofit使用转换器将POJO转换为JSON以获取请求,将JSON转换为POJO以进行响应。所以我认为它会将我的类转换为上面的JSON格式。   

是的,转换器用于将POJO转换为JSON,但它只转换POJO(Plain Old Java Objects)。在getUser方法中,loginRequestString而不是LoginRequest对象。当使用LoginRequest时,它将使用转换器进行转换。

从输出

  

loginRequest = my.package.name.Server.Data.Login.LoginRequest%40189d3779

我认为您使用toString()方法将LoginRequest转换为String。你可以尝试:

new Gson().toJson(loginRequestObject);

它会将你的对象转换为json字符串,但它不会很漂亮。您可能会得到类似 {\“loginId \”:\“userLoginId \”,\“password \”:\“userPassword \”} 而不是 {“loginId”:“userLoginId” ,“密码”:“userPassword”} 这对服务器来说很痛苦(只是我的假设)。