2015-05-20 13 views
10

Używam modernizacji do wywołania post api, otrzymuję następujący błąd podczas próby dotarcia do punktu końcowego.Powodowane przez: retrofit.RetrofitError: metoda POST musi mieć treść żądania

 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) 

próbuje uzyskać dostęp do posta API

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

rzeczywistego wywołanie API

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

         } 
        }); 
     }); 

Odpowiedz

13

to wygląda Retrofit chce żądania POST mieć ładowność. Jest już problemem dla niego: https://github.com/square/retrofit/issues/854

Jako obejście, można zrobić coś takiego:

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

a następnie wykonaj:

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

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

Lub, jeśli service.verifyIP(null) rzuca NPE, wymienić to z service.verifyIP("") lub podobnym.

+0

Dzięki Bart, to zadziałało. Użyłem service.verifyIP (""). Stworzyłem przykładową pracę wokół projektu, zanim przejdę do rzeczywistej aplikacji. Mam ten sam kod bez tej pracy w przykładowej aplikacji i działa. – 3xplore

+0

@ r7v, fajnie, dobrze to usłyszeć! –

+0

Dlaczego poprzedni działa dobrze, teraz używasz pracy nie powiodło się? Nie wiem dlaczego? – crossle

13

I rozwiązać ten problem poprzez zastąpienie @query do @Field, oto jak: kod

Nie działa:

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

przykład robocza:

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

Dla metod, które nie Mam pola, które muszę dodać pusty ciąg, jak poniżej:

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

i nazywają to przejście "":

restClient.postToServer(myPath, ""); 
2

Wydaje się, że jest podatna Retrofit rel.1.9 poprzez emisję (https://github.com/square/retrofit/issues/854).

W międzyczasie należy rozważyć obniżenie do poziomu rel. 1.6 do czasu usunięcia aktualnej wersji. Sprawdzono, że rel.1.6 jest wolny od tego konkretnego błędu.

0

właśnie to w metodzie @post

@Body String dummyValue, jeśli ciało nie jest wymagane należy napisać maila i wyślij "" do serwera

1

downgrade OkHttp do wersji 2.3.0

0

@Body String emptyBody nie działał dla mnie jako serwer zaplecza, z którym pracowałem, wracał Bad request i nie akceptował pustego łańcucha jako ciała.

Właśnie wysłał pustą JSON zamiast pusty ciąg

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

a potem po prostu nazywa się moja metoda to tak:

doThing(new JsonObject());

nadzieję, że to pomoże, jeśli ktoś ma podobny problem.

Powiązane problemy