10

我正在尝试使用 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>() {
        // ...
    }
)

而且我确定registrationBundleaJSONObject不是 null 或空的(其他字段当然没问题)。在发出请求的那一刻,它注销为: {"zip":19312,"useAccountZip":false,"controllerName":"mine","registrationCode":"GLD94Q"}

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

像这样在正文中发送 JSON 不起作用有什么原因吗?我在使用 Retrofit 时遗漏了一些简单的东西吗?

4

1 回答 1

31

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

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

您应该跳过默认情况下已经设置为带有 UTF-8 的 JSON 的 Content-type 标头。另外,不要将 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);
于 2013-12-31T17:18:44.640 回答