繁体   English   中英

POST主体JSON使用Retrofit

[英]POST body JSON using Retrofit

我正在尝试使用Retrofit库POST一个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不为空或空(其他字段当然是罚款)。 在提出请求时,它将注销为: {"zip":19312,"useAccountZip":false,"controllerName":"mine","registrationCode":"GLD94Q"}

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

是否有任何理由为什么在这样的身体中发送JSON不起作用? 我在使用Retrofit时遗漏了一些简单的东西吗?

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

发生的是您正在设置两次Content-type。 然后你传递一个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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM