Solicitud POST con Retrofit dando 500

Tengo el cuerpo siguiente enviado a través del regreso del cartero apenas muy bien (como JSON crudo)

{"payload":{"email":"","username":"","password":""}}

Llamada del cartero

Sin embargo, cuando intento enviarlo mediante Retrofit de la siguiente manera, no funciona (da 500):

 public Observable<JsonObject> signup(String email, String userName, String password) { JsonObject data = new JsonObject(); JsonObject payload = new JsonObject(); data.addProperty("email", email); data.addProperty("username", userName); data.addProperty("password", password); payload.add("payload", data); return mShoutApiService.signup(payload); } 

La llamada de servicio y el adaptador son los siguientes

Servicio:

 @POST("/signup") Observable<JsonObject> signup(@Body JsonObject payload); 

adaptador:

 private RestAdapter createRestAdapter(String hostUrl, GsonConverter gsonConverter, OkClient okClient) { return new RestAdapter.Builder() .setClient(okClient) .setConverter(gsonConverter) .setEndpoint(hostUrl) .setLogLevel(LogLevel.FULL) .setLog(new AndroidLog("SHOUT_LOG")) .build(); } private GsonConverter getGsonConverter(Gson gson) { return new GsonConverter(gson); } private OkClient getOkClient() { OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.setReadTimeout(READ_TIMEOUT, TimeUnit.SECONDS); okHttpClient.setConnectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS); return new OkClient(okHttpClient); } 

Los registros muestran lo siguiente

 03-23 05:04:00.380 2442-3468/shout.surge.com.shout D/SHOUT_LOG: ---> HTTP POST http://shout-api.herokuapp.com/signup 03-23 05:04:00.380 2442-3468/shout.surge.com.shout D/SHOUT_LOG: Content-Type: application/json; charset=UTF-8 03-23 05:04:00.380 2442-3468/shout.surge.com.shout D/SHOUT_LOG: Content-Length: 52 03-23 05:04:00.384 2442-3468/shout.surge.com.shout D/SHOUT_LOG: {"payload":{"email":"","username":"","password":""}} 03-23 05:04:00.384 2442-3468/shout.surge.com.shout D/SHOUT_LOG: ---> END HTTP (52-byte body) 03-23 05:04:09.180 2442-3468/shout.surge.com.shout D/SHOUT_LOG: <--- HTTP 500 http://shout-api.herokuapp.com/signup (8796ms) 

Parece que son la misma llamada exacta pero por alguna razón falla en mi aplicación móvil. Cualquier idea de lo que estoy perdiendo sería genial!

He echado un vistazo a su problema y como sospecho que de hecho está relacionado con una pequeña diferencia en las llamadas realizadas en la aplicación con las llamadas realizadas por el cartero. Desafortunadamente no puedo explicar por qué esto sucede porque ser un 500 es más probable que una implementación defectuosa en el lado del servidor.

El problema se resolvió para mí cuando he añadido el encabezado Accept: application/json como así:

 @Headers("Accept: application/json") @POST("/signup") Observable<JsonObject> signup(@Body JsonObject payload); 

He notado que la herramienta que estoy usando ( Advanced REST Client para cromo ) agregaba dicho encabezado a cada llamada.

Cuando quito esta cabecera consigo los 500 que usted experimentaba. También puede utilizar Accept: */* , pero no estoy seguro de que esto sea una buena práctica.

Siento no tener suficiente para decirte por qué sucede esto, pero arregló el problema para mí. Lo probé en una aplicación para Android.

  • Notificaciones Push utilizando el servidor Rails
  • Authenticity_token en Rails + Android
  • Cordova App en Android usando SSL enviando multipart / form-data causes Error de la aplicación de rack: # <EOFError: cuerpo de contenido incorrecto>
  • Sincronizar cliente Android y servidor REST
  • Api de Rails y autenticación nativa de aplicaciones para móviles
  • ¿Cómo usar doorkeeper con un cliente android?
  • MultipartEntityBuilder para enviar imágenes al servidor de carril
  • ¿Cómo crear un Api seguro de Rails REST para mi aplicación?
  • Solución de empuje de servidor en Rails
  • Diseña aplicaciones Omniauth y Iphone / Android
  • Grape Rails API con Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.