Caused by: retrofit.RetrofitError: method POST must have a request body
Caused by: retrofit.RetrofitError: method POST must have a request body
我正在使用改装进行 post api 调用,我在尝试到达端点时遇到以下错误。
Caused by: rx.exceptions.OnErrorNotImplementedException: method POST must have a request body.
at rx.Observable.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.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)
正在尝试访问 post 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) {
}
});
});
看起来 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("")
或类似的。
我通过将@Query 替换为@Field 解决了这个问题,方法如下:
无效代码:
@POST("/my/url/path")
Result postToServer(
@Query("user_name") String userName);
工作示例:
@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, "");
似乎 Retrofit rel.1.9 容易出现此问题 (https://github.com/square/retrofit/issues/854)。
与此同时,考虑降级到 rel.1.6,直到当前版本得到修复。
已验证 rel.1.6 没有此特定错误。
只需包含在@Post 方法
@Body String dummyValue ,如果不需要正文,您必须编写此查询并将“”发送到服务器
将 OkHttp 降级到 2.3.0 版本
@Body String emptyBody
不适合我,因为我正在使用后端服务器,返回 Bad request
并且不接受空字符串作为正文。
我刚刚发送了空 JSON 而不是空字符串
@POST("/some/url)
Observable<Thing> doThing(@Body JsonElement empty);
然后我就这样调用了我的方法:
doThing(new JsonObject());
希望对遇到类似问题的人有所帮助。
我正在使用改装进行 post api 调用,我在尝试到达端点时遇到以下错误。
Caused by: rx.exceptions.OnErrorNotImplementedException: method POST must have a request body.
at rx.Observable.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.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)
正在尝试访问 post 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) {
}
});
});
看起来 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("")
或类似的。
我通过将@Query 替换为@Field 解决了这个问题,方法如下:
无效代码:
@POST("/my/url/path")
Result postToServer(
@Query("user_name") String userName);
工作示例:
@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, "");
似乎 Retrofit rel.1.9 容易出现此问题 (https://github.com/square/retrofit/issues/854)。
与此同时,考虑降级到 rel.1.6,直到当前版本得到修复。 已验证 rel.1.6 没有此特定错误。
只需包含在@Post 方法
@Body String dummyValue ,如果不需要正文,您必须编写此查询并将“”发送到服务器
将 OkHttp 降级到 2.3.0 版本
@Body String emptyBody
不适合我,因为我正在使用后端服务器,返回 Bad request
并且不接受空字符串作为正文。
我刚刚发送了空 JSON 而不是空字符串
@POST("/some/url)
Observable<Thing> doThing(@Body JsonElement empty);
然后我就这样调用了我的方法:
doThing(new JsonObject());
希望对遇到类似问题的人有所帮助。