android – POST body JSON使用Retrofit

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

而且我确定的是,一个JSONObject的registrationBundle不为null或为空(其他字段当然不错).在请求的时刻,它注销为:{“zip”:19312,“useAccountZip”:false,“controllerName”:“mine”,“registrationCode”:“GLD94Q”}.

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

是否有任何原因为什么发送JSON在这样的身体不工作?我在使用Retrofit时缺少一些简单的东西吗?

解决方法

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

发生的是您正在设置内容类型两次.然后你传递一个JSONObject,它正在通过GsonConverter传递,并且被看作是{“nameValuePairs”:YOUrjsonSTRING},其中YOUrjsonSTRING包含完整的,预期的JSON输出.由于显而易见的原因,这对于大多数REST API将无法正常工作.

认情况下,您应该跳过已经使用UTF-8设置为JSON的Content-type标头.另外,不要将JSONObject传递给GSON.传递一个Java对象供GSON转换.

如果您使用回调,请尝试:

@POST("/api/v1/user/controller")
void registerController(
    @Body MyBundleObject registrationBundle,Callback<ResponSEObject> cb);

我还没有测试这个确切的语法.

同步示例:

@POST("/api/v1/user/controller")
ResponSEObject registerController(
    @Body MyBundleObject registrationBundle,@Header("x-company-device-guid") String companyDeviceGuid);

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...