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:
- La fábrica del convertidor de retroadaptación no puede acceder a GsonConverterFactory
- Descargar vídeo de Url con Retrofit
- Cómo Retrofit con OKHttp utilizar datos de caché cuando está fuera de línea
- Cómo saber cuándo finaliza una llamada de Retrofit
- Solicitud por lotes utilizando Retrofit
@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?
- Cómo obtener una respuesta genérica de Retrofit 2
- Excepción de interrupción de subproceso en modo Multi-ventana
- ¿Cómo reconstruir o restablecer caché Observable, utilizado con Retrofit para obtener nuevos datos?
- Retrofit: ¿Cómo especificar parámetros separados por comas en la solicitud?
- Android Tests: Stubbing Out Retrofit con Mockito
- Retrofit GSON serialize Fecha de json string en java.util.date
- Renovación de la referencia $ ref de objeto deserializante de JSON a su copia original
- Java.lang.NoClassDefFoundError: Resolución fallida de: Lretrofit2 / GsonConverterFactory;
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);