2015-05-20 27 views
10

मैं पुराना वापस उपयोग कर रहा हूँ एक पोस्ट एपीआई कॉल करने के लिए होना चाहिए, मैं निम्न त्रुटि endpoint हिट करने के लिए प्रयास करने के दौरान हो रही है।की वजह से: retrofit.RetrofitError: पद्धति POST एक अनुरोध शरीर

 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) 

एक पोस्ट एपीआई

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

         } 
        }); 
     }); 

उत्तर

13

यह रेट्रोफिट की तरह लग रहा

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

वास्तविक API कॉल का उपयोग करने की कोशिश कर पोस्ट अनुरोध चाहता है एक पेलोड है। वहां पहले से ही इसके लिए एक मुद्दा है: https://github.com/square/retrofit/issues/854

समाधान के लिए, आप कुछ इस तरह कर सकता है:

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

और उसके बाद कार्य करें:

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

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

या, यदि service.verifyIP(null) एक एनपीई फेंकता है, की जगह service.verifyIP("") या इसी तरह के साथ।

+0

धन्यवाद बार्ट, जो काम करता था। मैंने service.verifyIP ("") का उपयोग किया। मैंने वास्तविक ऐप में कूदने से पहले प्रोजेक्ट के आसपास नमूना कार्य किया था। नमूना ऐप में इस काम के बिना मेरे पास एक ही कोड है और यह काम करता है। – 3xplore

+0

@ r7v, अच्छा, इसे सुनकर अच्छा लगा! –

+0

पहले काम क्यों अच्छा है, अब काम का असफल रहा? मुझे नहीं पता क्यों? – crossle

13

मैं @Field को @query बदल कर भी इस समस्या हल हो जाती है, तो यहां है: नहीं है कि

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

तरीकों के लिए:

काम नहीं कर कोड:

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

कार्य उदाहरण किसी भी खेतों मैं था की तरह रिक्त स्ट्रिंग जोड़ने के लिए नीचे दिए गए

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

और यह "" गुजर फोन:

restClient.postToServer(myPath, ""); 
2

ऐसा लगता है कि रेट्रोफिट rel.1.9 मुद्दा (https://github.com/square/retrofit/issues/854) द्वारा होने का खतरा है।

इस बीच, rel.1.6 जब तक मौजूदा रिलीज ठीक किया जाएगा पदावनति पर विचार करें। यह सत्यापित किया जाता है कि rel.1.6 इस विशेष बग से मुक्त है।

0

सिर्फ @Post विधि में शामिल

@Body स्ट्रिंग dummyValue, अगर शरीर की आवश्यकता नहीं आप संस्करण के लिए सर्वर

1

ढाल OkHttp को यह क्वेरी लिखने और भेजना होगा "" 2.3.0

0

@Body String emptyBody मेरे लिए काम नहीं कर रहा था बैकएंड सर्वर के रूप में मैं के साथ, Bad request लौट रहा था और नहीं एक संस्था के रूप रिक्त स्ट्रिंग को स्वीकार काम कर रहा था।

मैं सिर्फ खाली स्ट्रिंग

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

के बजाय खाली JSON भेज दिया है और उसके बाद मैं बस अपना विधि कहा जाता है इस तरह:

doThing(new JsonObject());

आशा है कि अगर किसी को है यह आपकी मदद करेगा इसी तरह की समस्या।

संबंधित मुद्दे