Causado por: retrofit.RetrofitError: método POST debe tener un cuerpo de solicitud

Estoy usando retrofit para hacer una llamada de api de correo, estoy recibiendo el siguiente error al intentar golpear el punto final.

Caused by: rx.exceptions.OnErrorNotImplementedException: method POST must have a request body. at rx.Observable$30.onError(Observable.java:7334) at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:154) at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:111) at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.pollQueue(OperatorObserveOn.java:197) at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber$2.call(OperatorObserveOn.java:173) at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)             at android.os.Handler.handleCallback(Handler.java:739)             at android.os.Handler.dispatchMessage(Handler.java:95)             at android.os.Looper.loop(Looper.java:135)             at android.app.ActivityThread.main(ActivityThread.java:5221)             at java.lang.reflect.Method.invoke(Native Method)             at java.lang.reflect.Method.invoke(Method.java:372)             at Caused by: java.lang.IllegalArgumentException: method POST must have a request body. at com.squareup.okhttp.Request$Builder.method(Request.java:236) at retrofit.client.OkClient.createRequest(OkClient.java:59) at retrofit.client.OkClient.execute(OkClient.java:53) at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:326) 

Intentando acceder a un post api

  @POST("/service/v2/auth/ip-address") rx.Observable<AuthState> verifyIP(); 

Llamada api real

 LoginService service = CKRestClient.get().create(LoginService.class); service.verifyIP().observeOn(AndroidSchedulers.mainThread()).subscribe( new Action1<AuthState>() { @Override public void call(AuthState authState) { } }); }); 

Parece que Retrofit quiere que las solicitudes POST tengan una carga útil. Ya hay un problema: https://github.com/square/retrofit/issues/854

Como solución, podría hacer algo como esto:

 @POST("/service/v2/auth/ip-address") rx.Observable<AuthState> verifyIP(@Body Object dummy); 

Y luego hacer:

 LoginService service = CKRestClient.get().create(LoginService.class); service.verifyIP(null).observeOn(AndroidSchedulers.mainThread()).subscribe( new Action1<AuthState>() { @Override public void call(AuthState authState) { // ... } }); }); 

O bien, si service.verifyIP(null) lanza un NPE, sustitúyalo por service.verifyIP("") o similar.

Resolví este problema reemplazando @Query a @Field, aquí es cómo:

No funciona código:

 @POST("/my/url/path") Result postToServer( @Query("user_name") String userName); 

Ejemplo de trabajo:

 @FormUrlEncoded @POST("/my/url/path") Result postToServer( @Field("user_name") String userName); 

Para los métodos que no tienen ningún campo tuve que añadir cadena vacía como a continuación

 Result postToServer(@Path("my_path") String myPath, @Body String emptyString); 

Y lo llaman pasar "":

 restClient.postToServer(myPath, ""); 

Parece que Retrofit rel.1.9 es propenso por el problema ( https://github.com/square/retrofit/issues/854 ).

Mientras tanto, considere degradar a rel.1.6 hasta que se corrija la versión actual. Se verifica que rel.1.6 está libre de este error en particular.

Degradación de OkHttp a la versión 2.3.0

Sólo incluya en @Post Method

@Body String dummyValue, si el cuerpo no es necesario, debe escribir esta consulta y enviar "" al servidor

@Body String emptyBody no estaba funcionando para mí como servidor de backend con el que estaba trabajando, estaba devolviendo Bad request y no aceptaba cadena vacía como un cuerpo.

Acabo de enviar JSON vacío en lugar de cadena vacía

@POST("/some/url) Observable<Thing> doThing(@Body JsonElement empty);

Y luego acabo de llamar a mi método como este:

doThing(new JsonObject());

Espero que ayude si alguien tiene un problema similar.

  • ¿Está haciendo la llamada de red segura en ArrayAdapter?
  • No se puede crear el convertidor para java.util.List Retrofit 2.0.0-beta2
  • ¿Cómo agregar múltiples del mismo parámetro / array usando Retrofit?
  • Android Retrofit - cómo sustituir baseUrl
  • ¿Cómo puedo enviar una matriz de objetos en un POST retrofit?
  • Cómo obtener JSON de objeto RetrofitError utilizando Retrofit
  • Manejo de errores personalizado con Retrofit
  • Retrofit 2.0 beta1: cómo publicar cuerpo de cuerda cruda
  • Reintentar la solicitud utilizando Retrofit 2
  • Retrofit 2 - cuerpo de respuesta nula
  • ¿Hay alguna manera de agregar parámetros de consulta a cada solicitud con Retrofit 2?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.