I am using retrofit to make a post api call, I am getting the following error while trying to hit the endpoint.
Caused by: rx.exceptions.OnErrorNotImple
downgrade OkHttp to version 2.3.0
@Body String emptyBody
wasn't working for me as backend server I was working with, was returning Bad request
and not accepting empty string as a body.
I've just sent empty JSON instead of empty String
@POST("/some/url)
Observable<Thing> doThing(@Body JsonElement empty);
and then I just called my method like this:
doThing(new JsonObject());
Hope it will help if someone has similar problem.
It looks like Retrofit wants POST requests to have a payload. There's already an issue for it: https://github.com/square/retrofit/issues/854
As a workaround, you could do something like this:
@POST("/service/v2/auth/ip-address")
rx.Observable<AuthState> verifyIP(@Body Object dummy);
and then do:
LoginService service = CKRestClient.get().create(LoginService.class);
service.verifyIP(null).observeOn(AndroidSchedulers.mainThread()).subscribe(
new Action1<AuthState>() {
@Override
public void call(AuthState authState) {
// ...
}
});
});
Or, if service.verifyIP(null)
throws a NPE, replace it with service.verifyIP("")
or similar.
It seems that Retrofit rel.1.9 is prone by the issue (https://github.com/square/retrofit/issues/854).
In the meantime, consider downgrading to rel.1.6 until current release will be fixed. It is verified that rel.1.6 is free of this particular bug.
just include in @Post Method
@Body String dummyValue , if body not required you must write this query and send "" to server
I solved this issue by replacing @Query to @Field, here is how:
Not working code:
@POST("/my/url/path")
Result postToServer(
@Query("user_name") String userName);
Working example:
@FormUrlEncoded
@POST("/my/url/path")
Result postToServer(
@Field("user_name") String userName);
For methods that do not have any fields I had to add empty string like below
Result postToServer(@Path("my_path") String myPath,
@Body String emptyString);
And call it passing "":
restClient.postToServer(myPath, "");