Retrofit 2.0怎么删除?

Retrofit 2.0 how to delete?

我正在使用 retrofit 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:服务方法不能 return 无效。对于方法 LibraryService.deleteBook.

我也试了一下:

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

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

无论我使用 okhttp3.Response 还是 retrofit2.Response,我都会得到错误:'*.Response' 不是有效的响应主体类型。您是指 ResponseBody 吗?

谁能给我一个删除成功的例子吗?我在网上搜索但找不到足够的信息。非常感谢。

按照您上次记下的方式进行:

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

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

ResponseBody 对象将 return 调用的结果。这是我用于某些不 return 实体对象的 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
    }
});

或者,杰克沃顿建议

Use Void which not only has better semantics but is (slightly) more efficient in the empty case and vastly more efficient in a non-empty case (when you just don't care about body).

所以你有:

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:遗漏了正确的回调定义。固定 :)