【问题标题】:How to perform a DELETE request without return type or Callback? [Retrofit]如何在没有返回类型或回调的情况下执行 DELETE 请求? [改造]
【发布时间】:2015-05-12 06:57:15
【问题描述】:

我需要使用 Retrofit 执行删除请求。所以,我的界面代码sn-p是这样的:

@DELETE("/api/item/{id}")
void deleteItem(@Path("id") int itemId);

但我得到了错误:

java.lang.IllegalArgumentException: ApiItem.deleteItem: 必须有 返回类型或回调作为最后一个参数。

但是,根据 Rest API 的规则,我不应该收到任何对 DELETE 请求的响应。应该如何在界面中指定呢?

谢谢。

【问题讨论】:

    标签: java android rest retrofit


    【解决方案1】:

    如果您想使用 void 方法,您必须将 Callback 添加为请求方法中的最后一个参数。你可以使用Callback<Response>

    你必须改变这个:

    @DELETE("/api/item/{id}")
    void deleteItem(@Path("id") int itemId);
    

    到:

    @DELETE("/api/item/{id}")
    void deleteItem(@Path("id") int itemId, Callback<Response> callback);
    

    或者您可以只返回Response

    @DELETE("/api/item/{id}")
    Response deleteItem(@Path("id") int itemId);
    

    【讨论】:

    • 而在Callback的情况下重写的方法应该是这样的? RestApiStorage.me().getApiItem().deleteItem(itemId, null);
    • 不使用 new Callback(){...method...} 并忽略响应
    • 使用 Void 作为返回类型
    • 我使用 void 作为返回类型:'@DELETE("books/{id}") void deleteBook(@Path("id") int itemId);'我收到一个错误:java.lang.IllegalArgumentException:服务方法不能返回 void。对于方法 LibraryService.deleteBook。 对此有何建议?谢谢。
    • 通过使用以下建议:''@DELETE("books/{id}") void deleteBook(@Path("id") int bookId, Callback callback);'' I得到相同的错误:**java.lang.IllegalArgumentException:服务方法不能返回 void。对于方法 LibraryService.deleteBook。 **
    【解决方案2】:

    在 Retrofit 2.0 中,您可以使用 Call 接口获取请求的结果,如下所示。

    @DELETE("/api/item/{id}")
    Call<Response> deleteItem(@Path("id") int itemId);
    
    ...
    
    Call<Response> call = YourServiceInstance.deleteItem(10);
    call.enqueue(new Callback<Response>() {
    ...
    });
    

    【讨论】:

    • 也许我很密集,但是,哪个响应? OkHttp 的回应?改造是模板化的......
    • OK Http 响应对象
    • 如果使用 Retrofit 的响应,会得到错误信息:""'retrofit2.Response' 不是有效的响应体类型。您是说 ResponseBody 吗?\n" + " 表示方法 CallMethod.badType1""
    • @BurtK,这是唯一没有错误的,但现在 response.body () 返回 null 我。两者都调用 何时调用 。有光吗?
    • 这应该是公认的答案,考虑到现在是 2018 年,可能会更新。
    【解决方案3】:
    @FormUrlEncoded
    @HTTP(method = "DELETE", path = "manage-feed", hasBody = true)
    Call<ResponseBody> deletePost(@Field("post_id") Integer postId, @Field("share_id") Integer sharedMapId);
    

    【讨论】:

    • 你能补充一些解释吗
    • 这是删除你在接口中放置方法的方法
    • 你救了我的命,谢谢它对我有用我不得不使用@HTTP(method = "DELETE", hasBody = true) 而不是@DELETE
    【解决方案4】:
        @HTTP(method = "DELETE", path = "/api/item/{id}", hasBody = false)
    fun deleteItemId(
    @Path("id") id: Int
    ) : Call<YourResponse>
    
    hasBody = 
    true -> if api has request body
    false -> if api has not a request body
    

    【讨论】:

      猜你喜欢
      • 2019-06-09
      • 2015-06-21
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 2021-12-27
      • 2020-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多