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
- RETROFIT POST Objeto Realm
- Detener y reanudar las descargas utilizando Retrofit
- Uso de URLs absolutas con Retrofit
- ¿Cómo puedo usar retrofit library con la barra de progreso?
- Excepción Outofmemory utilizando la biblioteca retrofit android
@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) { } }); });
- Buen enfoque para reintentar manualmente solicitudes en Retrofit Android
- Retrofit java.net.SocketTimeoutException
- Retrofit getBodyAs () no puede analizar el error del servidor
- Retroalimentación personalizada ErrorHandler da UndeclaredThrowableException
- Reajustar varios parámetros POST
- ¿Cómo se maneja el error en Retrofit 2? ¿No encuentro la clase RetrofitError que sugiere la mayoría de las soluciones?
- Retrofit da EOFException sólo la primera vez
- Retrofit y caracteres Slash en PATH
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.
- Cifrado utilizando AES-128 en Android e IPhone (Resultado diferente)
- ¿Cómo acceder a la base de datos sqlite existente en Android Emulator?