我有一个POJO,我想使用Retrofit 2.0.2发送到我的后端服务器。这是一个简单LoginRequest
loginId
和password
。这是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。所有我都知道我的对象,其中的每个字段都由设置者初始化。
是什么原因?我的代码遗漏了什么吗?
答案 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
方法中,loginRequest
是String
而不是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”} 这对服务器来说很痛苦(只是我的假设)。