2015-05-20 3 views
10

Ich benutze Retrofit, um einen Post-API-Anruf zu machen, bekomme ich den folgenden Fehler beim Versuch, den Endpunkt zu treffen.Verursacht von: retrofit.RetrofitError: Methode POST muss eine Anfrage haben Körper

 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, einen Beitrag api

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

Anruf tatsächlich api

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

         } 
        }); 
     }); 

Antwort

13

Es ist wie Retrofit sieht zugreifen möchte Anfragen POST eine Nutzlast haben. Es gibt bereits ein Problem für sie: https://github.com/square/retrofit/issues/854

Als Abhilfe können Sie so etwas wie dies tun könnte:

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

und dann tun:

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

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

Oder, wenn service.verifyIP(null) eine NPE wirft, ersetzen es mit service.verifyIP("") oder ähnlich.

+0

Dank Bart, das hat funktioniert. Ich benutzte service.verifyIP (""). Ich hatte ein Beispielprojekt erstellt, bevor ich in die eigentliche App sprang. Ich habe den gleichen Code ohne dies in der Beispiel-App zu umgehen und es funktioniert. – 3xplore

+0

@ r7v, cool, gut zu hören! –

+0

Warum funktionieren die vorher gut, jetzt funktioniert die Arbeit fehlgeschlagen? Ich weiß nicht warum? – crossle

13

löste ich dieses Problem durch @Query zu @Field ersetzen, ist hier, wie:

Problem 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 nicht tun haben alle Felder, die ich hatte leere Zeichenfolge hinzuzufügen, wie unten

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

und nennen es "" vorbei:

restClient.postToServer(myPath, ""); 
2

Es scheint, dass Retrofit rel.1.9 durch Ausgabe anfällig ist (https://github.com/square/retrofit/issues/854).

In der Zwischenzeit sollte ein Downgrade auf rel.1.6 durchgeführt werden, bis die aktuelle Version behoben wird. Es ist verifiziert, dass rel.1.6 frei von diesem speziellen Fehler ist.

0

sind nur in @Post Methode

@Body String dummyValue, wenn Körper nicht erforderlich Sie diese Abfrage schreiben müssen und senden "", um Server

1

Herabstufung OkHttp auf Version 2.3.0

0

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

ich nur leere JSON statt

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

leeren String gesendet habe und dann meine Methode, wie ich dies nur genannt:

doThing(new JsonObject());

es hilft, Hoffnung, wenn jemand ähnliches Problem.

Verwandte Themen