我正在尝试使用Retrofit库发布JSONObject,但是当我在接收端看到请求时,content-length为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)不为null或为空(其他字段肯定很好)。在发出请求的那一刻,它以{"zip":19312,"useAccountZip":false,"controllerName":"mine","registrationCode":"GLD94Q"}登出。

在请求的接收端,我看到该请求具有Content-type: application/json但具有Content-length: 0

有什么理由不能像这样在体内发送JSON吗?我在使用Retrofit时缺少一些简单的东西吗?

最佳答案

默认情况下,如果需要JSON请求正文,则无需设置任何 header 。每当您测试改造代码时,建议您在RestAdapter实例上设置.setLogLevel(RestAdapter.LogLevel.FULL)。这将显示完整的请求 header 和正文以及完整的响应 header 和正文。

发生的情况是您两次设置了Content-type。然后,您要传递一个JSONObject,该对象将通过GsonConverter传递并被修饰成类似于{"nameValuePairs":YOURJSONSTRING},其中YOURJSONSTRING包含您完整的预期JSON输出。出于显而易见的原因,这不适用于大多数REST API。

您应该跳过Content-type header ,该 header 已经默认使用UTF-8设置为JSON。另外,不要将JSONObject传递给GSON。传递Java对象以供GSON转换。

如果您使用回调,请尝试以下操作:

@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);

关于android - 使用翻新的POST正文JSON,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19099536/

10-12 00:26
查看更多