引起:retrofit.RetrofitError:方法POST必须有一个请求体

时间:2015-05-20 19:17:52

标签: android retrofit

我正在使用改造来进行后api调用,我在尝试命中端点时遇到以下错误。

     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)

尝试访问帖子api

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

实际的api电话

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

                        }
                    });
        });

6 个答案:

答案 0 :(得分:17)

看起来Retrofit希望POST请求拥有有效负载。它已经存在问题: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)抛出NPE,请将其替换为service.verifyIP("")或类似内容。

答案 1 :(得分:13)

我通过将@Query替换为@Field解决了这个问题,方法如下:

不工作代码:

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

工作示例:

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

对于没有任何字段的方法,我必须添加空字符串,如下所示

restClient.postToServer(myPath, "");

并称之为传递&#34;&#34;:

{{1}}

答案 2 :(得分:2)

似乎Retrofit rel.1.9倾向于问题(https://github.com/square/retrofit/issues/854)。

与此同时,考虑降级到rel.1.6,直到当前版本得到修复。 验证了rel.1.6没有这个特定的bug。

答案 3 :(得分:0)

只包括@Post方法

@Body String dummyValue,如果不需要正文,则必须编写此查询并将“”发送到服务器

答案 4 :(得分:0)

将OkHttp降级到版本2.3.0

答案 5 :(得分:0)

@Body String emptyBody对我来说并不适用于我正在使用的后端服务器,正在返回Bad request并且不接受空字符串作为正文。

我刚刚发送了空JSON而不是空字符串

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

然后我就像这样调用我的方法:

doThing(new JsonObject());

希望如果有人遇到类似问题会有所帮助。