POST cuerpo JSON utilizando Retrofit

Estoy intentando POST un JSONObject que usa la biblioteca de Retrofit, pero cuando veo la petición en el extremo de la recepción, el contenido-longitud es 0 .

En la interfaz 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); 

Y se llama con,

 mRestService.registerController( registrationBundle, mApplication.mSession.getCredentials().getDeviceToken(), mApplication.mSession.getCredentials().getDeviceGuid(), new Callback<JSONObject>() { // ... } ) 

Y estoy seguro de que el registrationBundle , que es un JSONObject no es nulo o vacío (los otros campos son sin duda bien). En el momento en que se realiza la solicitud, se desconecta como: {"zip":19312,"useAccountZip":false,"controllerName":"mine","registrationCode":"GLD94Q"} .

En el extremo de recepción de la solicitud, veo que la solicitud tiene Content-type: application/json pero tiene Content-length: 0 .

¿Hay alguna razón por la que enviar JSON en el cuerpo como este no está funcionando? ¿Estoy perdiendo algo sencillo al usar Retrofit?

De forma predeterminada, no es necesario establecer encabezados si desea un cuerpo de solicitud JSON. Siempre que pruebe el código de Retrofit, le recomiendo establecer .setLogLevel(RestAdapter.LogLevel.FULL) en su instancia de RestAdapter. Esto le mostrará los encabezados de la solicitud completa y el cuerpo, así como los encabezados de respuesta completa y el cuerpo.

Lo que ocurre es que está configurando el Content-type dos veces. Entonces estás pasando un JSONObject, que se está pasando a través de GsonConverter y mutilado para que parezca {"nameValuePairs":YOURJSONSTRING} donde YOURJSONSTRING contiene su salida JSON completa, prevista. Por razones obvias, esto no funcionará bien con la mayoría de las API de REST.

Debería omitir el desorden con el encabezado Content-type que ya se está configurando en JSON con UTF-8 de forma predeterminada. Además, no pase un JSONObject a GSON. Pasar un objeto Java para que GSON se convierta.

Pruebe esto si utiliza devoluciones de llamada:

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

No he probado esta sintaxis exacta.

Ejemplo síncrono:

 @POST("/api/v1/user/controller") ResponseObject registerController( @Body MyBundleObject registrationBundle, @Header("x-company-device-token") String companyDeviceToken, @Header("x-company-device-guid") String companyDeviceGuid); 
  • POST con Android Retrofit
  • ¿Cómo puedo interceptar un objeto observable y modificarlo en RxJava antes de volver al suscriptor?
  • ¿Cómo pasar el enum personalizado en @Query a través de Retrofit?
  • ¿Cómo determinar si se está ejecutando una solicitud determinada?
  • Retrofit / Robospice: ¿Obtener los encabezados de respuesta de una solicitud exitosa?
  • Añadir cookies para la actualización de 2 solicitudes
  • ¿Cómo puedo obtener Robospice para tratar cualquier cosa que no sea una respuesta 200 de Retrofit & OKHttp como un error
  • Cambiar ConnectionTimeout de Retrofit OkHttpClient en tiempo de ejecución
  • Encadenamiento de llamadas de Retrofit con RxJava y devolución del objeto principal
  • Android - Configuración de Retrofit / Apache HttpClient para Digest Auth
  • Uso de Gson y Retrofit 2 para deserializar las complejas respuestas de la API
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.