【问题标题】:How do you specify that an API method has no response body?如何指定 API 方法没有响应主体?
【发布时间】:2015-12-28 16:17:32
【问题描述】:

我正在尝试使用 Retrofit 2.0 和 converter-jackson 模块来使用 API。

我有一些 GET 方法来获取某些对象的状态并将接收到的有效负载转换为对象工作正常。

我还有一个需要 PUT 的端点,以确认我已处理返回给 GET 请求的对象。此 PUT 方法不返回正文,如果一切正常,则仅返回状态 200 或适当的错误代码。

我尝试了几种不同的方法在我的 Retrofit 界面中指定 put 方法,但均未成功。我收到这样的错误:

com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
 at [Source: java.io.InputStreamReader@1d5ef9ae; line: 1, column: 1]

如果我将方法的返回类型指定为我不希望收到的某个对象,如下所示:

@PUT('/acknowledgeStatus')
Call<String> acknowledgeStatus(@Body Acknowledgement idsToAcknowledge)

我得到这样的错误:

java.lang.IllegalArgumentException: Could not locate call adapter for class com.example.MyObject. Tried:
 * retrofit.DefaultCallAdapter$1

MyObject 是当我尝试定义 PUT 方法时,我的 Retrofit API 的其他 GET 方法之一返回的对象:

@PUT('/acknowledgeStatus')
Call acknowledgeStatus(@Body Acknowledgement idsToAcknowledge)

@PUT('/acknowledgeStatus')
Response acknowledgeStatus(@Body Acknowledgement idsToAcknowledge)

如何告诉 Retrofit 不要期望此方法的响应正文,并且仍然可以访问响应状态、标头和其他详细信息?

【问题讨论】:

    标签: retrofit


    【解决方案1】:

    更新:从第二个测试版开始,您可以使用Void的返回类型

    @PUT('/acknowledgeStatus')
    Call<Void> acknowledgeStatus(@Body Acknowledgement idsToAcknowledge)
    

    以下仍然有效,但可能效率较低 --

    试着告诉它你想要一个ResponseBody

    @PUT('/acknowledgeStatus')
    Call<ResponseBody> acknowledgeStatus(@Body Acknowledgement idsToAcknowledge)
    

    这将使您能够访问响应状态等,以及原始响应正文(如果有)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 2018-10-09
      相关资源
      最近更新 更多