Retrofit中如何处理204 No Content响应的回调?

20

在Android上,我最初实现了一个Retrofit接口,代码如下:

@DELETE(USER_API_BASE_URL + "/{id}")
public void deleteUser(@Path("id") String id, Callback<User> callback);

成功删除后,服务器返回204 NO CONTENT。这导致回调触发失败,并出现错误信息retrofit.RetrofitError: End of input at character 0 of,因为它期望在响应中返回一个User对象。

然后我将其重写为使用Void替代User:

@DELETE(USER_API_BASE_URL + "/{id}")
public void deleteUser(@Path("id") String id, Callback<Void> callback);  <-- VOID

但是我从回调函数中得到了相同的错误。 有什么正确的方法来修复这个问题?谢谢。


它能与Callback<Response>一起使用吗?另外,您使用的是哪个版本的Retrofit? - Volodymyr Baydalka
4
您可以使用“ResponseCallback”来实现这一点。 - Jake Wharton
@ticofab 你是怎么解决这个问题的?我遇到了这个问题:接口方法 'java.io.InputStream retrofit.mime.TypedInput.in()' 报告了一个空对象引用。你能帮我解决一下吗? - Akshay Mukadam
@AkshayMukadam 我是按照上面两条评论和下面一条回答所指示的方法解决了它 :) 使用 ResponseCallback - ticofab
@ticofab 我正在尝试使用Uber API,但是我收到了上述错误。 - Akshay Mukadam
显示剩余3条评论
3个回答

31

Retrofit 2.x 不再像其他答案中提到的那样具有 ResponseCallback。您需要使用 Response<Void> 类型。

RxJava 声明:

@PUT Observable<Response<Void>> foo();

标准声明:

@PUT Call<Response<Void>> bar();

2
但问题是,即使Web服务调用出现错误,它也会执行成功块而不是可抛出块。 - MobileMon
我正在使用Retrofit和Moshi 2.3.0时收到“无法序列化抽象类okhttp3.ResponseBody”的错误。 - Greg Ennis
@SammyPatenotte,实际上这个答案已经过时了。在Retrofit 2.3.0中,只使用PUT Call<Void> bar()即可按预期工作;不需要Response<>返回类型。 - Greg Ennis
嗯,这很奇怪,在我的情况下,仅使用Void无法正常工作,但我正在将其用于POST请求,所以我不确定这是否是原因。 - Sammy Patenotte
这个答案适用于服务器返回204的@DELETE。谢谢! - Roon13
显示剩余2条评论

9
解决方案在评论中由Jake Wharton指出。使用ResponseCallback。
编辑:对于Retrofit <2,此响应不再有效。

伙计们,这个回答中的链接是无效的。-_-||| - codezjx

1
这是Kotlin实现处理HTTP 204和无内容的方式。
@DELETE(USER_API_BASE_URL + "/{id}")
suspend fun deleteuser(@HeaderMap headers: Map<String, String>, 
                       @Path("id") id: String)
: Response<Void>

使用 Response<Void> 将会成功处理 204 状态码,但也会对 400 状态码成功处理,对于 4xx 状态码响应,throwable 块不会被调用。 - Victor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接