改造2.0如何删除?

2022-09-04 02:22:25

我正在使用改造2.0,并且我正在我的Android应用程序中实现删除功能,但是,我无法成功,有人可以给我一个建议吗?

我尝试了两者:

@DELETE("books/{id}") void deleteBook(@Path("id") int itemId);

@DELETE("books/{id}") void deleteBook(@Path("id") int bookId, Callback<Response> callback);

我收到错误 java.lang.IllegalArgumentException: Service methods 不能返回 void。

我也试了一下:

Response deleteBook(@Path("id") int bookId);

Call<Response> deleteBook(@Path("id") int bookId);

无论我使用okhttp3。响应或改造2.响应,我将得到错误:'*。响应' 不是有效的响应正文类型。你是说 ResponseBody 吗?

有人可以给我一个成功的删除示例吗?我在网上谷歌,但找不到足够的信息。多谢。


答案 1

按照您上次指出的方式执行此操作:

Call<ResponseBody> deleteBook(@Path("id") int bookId);

确保通过 AsyncTask 或其他线程机制调用 UI 线程。不确定你以前是否使用过RxJava + Retrofit 2,但它很好。

对象将返回调用的结果。这就是我用于一些不返回实体对象的REST API请求,我所关心的只是查看响应代码。

Call<ResponseBody> deleteRequest = mService.deleteBook(123);
deleteRequest.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
        // use response.code, response.headers, etc.
    }

    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) {
        // handle failure
    }
});

或者,杰克·沃顿建议

使用Void,它不仅具有更好的语义,而且在空的情况下(稍微)更有效,在非空的情况下(当你只是不关心身体时)更有效率。

所以你有:

Call<Void> deleteBook(@Path("id") int bookId);

用法:

deleteRequest.enqueue(new Callback<Void>() {
    @Override
    public void onResponse(Call<Void> call, Response<Void> response) {
        // use response.code, response.headers, etc.
    }

    @Override
    public void onFailure(Call<Void> call, Throwable t) {
        // handle failure
    }
});

如果您只关心响应代码并且没有响应的正文,则更好

编辑2:省略了正确的回调定义。固定:)


答案 2

推荐