我正在尝试使用Retrofit库发布JSONObject,但是当我在接收端看到请求时,内容长度为0
。
在RestService接口中:
@Headers({
"Content-type: application/json"
})
@POST("/api/v1/user/controller")
void registerController(
@Body JSONObject registrationBundle,
@Header("x-company-device-token") String companyDeviceToken,
@Header("x-company-device-guid") String companyDeviceGuid,
Callback<JSONObject> cb);
用它调用它,
mRestService.registerController(
registrationBundle,
mApplication.mSession.getCredentials().getDeviceToken(),
mApplication.mSession.getCredentials().getDeviceGuid(),
new Callback<JSONObject>() {
// ...
}
)
我确定registrationBundle
,JSONObject
不是空或空(其他字段肯定没问题)。在提出请求时,它会以{"zip":19312,"useAccountZip":false,"controllerName":"mine","registrationCode":"GLD94Q"}
。
在请求的接收端,我看到该请求已Content-type: application/json
但Content-length: 0
。
有没有理由为什么在这样的身体中发送JSON不起作用?我在使用Retrofit时遗漏了一些简单的东西吗?
答案 0 :(得分:31)
默认情况下,如果需要JSON请求正文,则无需设置任何标头。每当您测试Retrofit代码时,我建议您在RestAdapter实例上设置.setLogLevel(RestAdapter.LogLevel.FULL)
。这将显示完整的请求标题和正文以及完整的响应标题和正文。
正在发生的是您要将内容类型设置两次。然后你传递一个JSONObject,它正在通过GsonConverter传递并被修改为{"nameValuePairs":YOURJSONSTRING}
,其中YOURJSONSTRING
包含你完整的,预期的JSON输出。出于显而易见的原因,这对大多数REST API都不适用。
您应该跳过使用默认情况下已使用UTF-8设置为JSON的Content-type标头。另外,不要将JSONObject传递给GSON。传递GSON的Java对象进行转换。
如果您正在使用回调,请尝试此操作:
@POST("/api/v1/user/controller")
void registerController(
@Body MyBundleObject registrationBundle,
@Header("x-company-device-token") String companyDeviceToken,
@Header("x-company-device-guid") String companyDeviceGuid,
Callback<ResponseObject> cb);
我没有测试过这种确切的语法。
同步示例:
@POST("/api/v1/user/controller")
ResponseObject registerController(
@Body MyBundleObject registrationBundle,
@Header("x-company-device-token") String companyDeviceToken,
@Header("x-company-device-guid") String companyDeviceGuid);