如何使用Retrofit 2处理空响应体?

Yev*_*ach 114 android square retrofit retrofit2

最近我开始使用__CODE__,我遇到了解析空响应体的问题.我有一个服务器只响应http代码而没有响应体内的任何内容.如何只处理有关服务器响应的元信息(标题,状态代码等)?

提前致谢!

iag*_*een 194

编辑:

正如杰克沃顿指出的那样,

@GET("/path/to/get")
Call<Void> getMyData(/* your args here */);
Run Code Online (Sandbox Code Playgroud)

与我最初的回应相比,这是最好的方式 -

你可以只返回一个ResponseBody,它将绕过解析响应.

@GET("/path/to/get")
Call<ResponseBody> getMyData(/* your args here */);
Run Code Online (Sandbox Code Playgroud)

然后在你的电话中,

Call<ResponseBody> dataCall = myApi.getMyData();
dataCall.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Response<ResponseBody> response) {
        // use response.code, response.headers, etc.
    }

    @Override
    public void onFailure(Throwable t) {
        // handle failure
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 更好的是:使用`Void`,它不仅具有更好的语义,而且在空情况下(略微)更高效,在非空情况下(当你不关心身体时)效率更高. (56认同)
  • @JakeWharton很好的建议使用`Void`.在Kotlin代码中使用`Unit`会在Java中为Retrofit提供"Void"的相同好处吗? (7认同)
  • 我刚刚检查了@ akshay-chordiya,Kotlin中的`Unit`不起作用,但是`Void`不起作用。我假设某处有一个硬编码的支票。 (3认同)
  • @JakeWharton 那是很棒的行为。感谢您指出。答案已更新。 (2认同)
  • 很好的答案.不使用Void的一个原因是,如果您的资源仅在请求失败时返回正文,并且您想将errorBody ResponseBody转换为某种特定或常见类型. (2认同)
  • @jonney我有一个API,其端点仅在出错时返回响应正文。我将其定义为“Call&lt;ResponseBody&gt;”,并且仅在“onFailure”处理程序中查看它。它是 `onResponse` 处理程序中的一个无操作参数。 (2认同)
  • @user3363866 在 Kotlin 中使用 Unit 对我有用,10 分钟前测试过。 (2认同)

Ahm*_*egy 35

如果你使用RxJava,那么Completable在这种情况下最好使用它

表示没有任何值的延迟计算,但仅表示完成或异常.该类遵循与Reactive-Streams类似的事件模式:onSubscribe(onError | onComplete)?

http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Completable.html

在接受的答案中:

@GET("/path/to/get")
Observable<Response<Void>> getMyData(/* your args here */);
Run Code Online (Sandbox Code Playgroud)

如果端点返回失败响应代码,它仍然在,onNext并且您必须自己检查响应代码.

但是,如果你使用Completable.

@GET("/path/to/get")
Completable getMyData(/* your args here */);
Run Code Online (Sandbox Code Playgroud)

你将只有onCompleteonError.如果响应代码成功,它将触发它将触发的onComplete其他内容onError.

  • 在这种情况下,`onError` `Throwable` 参数将包含什么?我发现这更干净,但我们仍然经常需要查看响应代码和正文以查找失败。 (2认同)

Gen*_*wen 24

如果您使用的是rxjava,请使用以下内容:

@GET("/path/to/get")
Observable<Response<Void>> getMyData(/* your args here */);
Run Code Online (Sandbox Code Playgroud)

  • 我们有一个端点 API,成功时返回空正文,出错时返回 json 正文。如果使用 Response&lt;Void&gt;,我该如何处理错误情况? (3认同)

pzu*_*ulw 15

对于 kotlin,使用返回类型Call<Void>仍然会抛出异常IllegalArgumentException: Unable to create converter for retrofit2.Call<java.lang.Void>

使用 Response 而不是 Call 解决了该问题

@DELETE("user/data")
suspend fun deleteUserData(): Response<Void>
Run Code Online (Sandbox Code Playgroud)