wake-up-neo.com

Verursacht durch: retrofit.RetrofitError: Methode POST muss einen Anfragetext haben

Ich benutze Retrofit, um einen Post-API-Aufruf durchzuführen. Beim Versuch, den Endpunkt zu erreichen, erhalte ich die folgende Fehlermeldung.

     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)

versuchen, auf eine Post-API zuzugreifen

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

aktueller api-anruf

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

                        }
                    });
        });
12
3xplore

Es sieht so aus, als wolle Retrofit POST -Anfragen eine Nutzlast haben. Es gibt schon ein Problem dafür: https://github.com/square/retrofit/issues/854

Um dies zu umgehen, können Sie Folgendes tun:

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

und dann mache:

LoginService service = CKRestClient.get().create(LoginService.class);

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

Wenn service.verifyIP(null) eine NPE auslöst, ersetzen Sie sie durch service.verifyIP("") oder Ähnliches.

17
Bart Kiers

Ich habe dieses Problem durch Ersetzen von @Query in @Field gelöst.

Nicht funktionierender Code:

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

Arbeitsbeispiel:

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

Für Methoden, die keine Felder haben, musste ich eine leere Zeichenfolge wie unten hinzufügen

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

Und nennen Sie es "vorbei":

restClient.postToServer(myPath, "");
13
Defuera

Es scheint, dass Retrofit rel.1.9 von diesem Problem betroffen ist ( https://github.com/square/retrofit/issues/854 ).

Erwägen Sie in der Zwischenzeit ein Downgrade auf rel.1.6, bis das aktuelle Release behoben ist. Es wird bestätigt, dass rel.1.6 frei von diesem bestimmten Fehler ist.

2
Eugene Karasev

@Body String emptyBody arbeitete für mich nicht als Backend-Server, mit dem ich arbeitete, gab Bad request zurück und akzeptierte keine leere Zeichenfolge als Body.

Ich habe nur leere JSON-Zeichenfolge anstelle von leerem String gesendet

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

und dann habe ich meine Methode so genannt:

doThing(new JsonObject());

Ich hoffe es hilft, wenn jemand ein ähnliches Problem hat.

0
Peter Moskala

herunterstufen von OkHttp auf Version 2.3.0

0
Andrei Tr.

nur in @Post-Methode einfügen

@Body String dummyValue, wenn body nicht erforderlich ist, müssen Sie diese Abfrage schreiben und "" an den Server senden

0
Out Of Bounds