Retrofit 2.0如何删除?

xia*_*orm 12 java android http-delete retrofit retrofit2

我正在使用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);
Run Code Online (Sandbox Code Playgroud)

我得到错误java.lang.IllegalArgumentException:服务方法不能返回void.方法LibraryService.deleteBook.

我也尝试过这个:

Response deleteBook(@Path("id") int bookId);
Run Code Online (Sandbox Code Playgroud)

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

无论我使用okhttp3.Response还是retrofit2.Response,我都会收到错误:'*.Response'不是有效的响应体类型.你的意思是ResponseBody?

有人可以给我一个成功的删除示例吗?我在网上搜索但找不到足够的信息.非常感谢.

Luc*_*ord 18

就像你上次提到的那样这样做:

Call<ResponseBody> deleteBook(@Path("id") int bookId);
Run Code Online (Sandbox Code Playgroud)

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

ResponseBody对象将返回调用的结果.这是我用于一些不返回实体对象的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
    }
});
Run Code Online (Sandbox Code Playgroud)

或者,杰克沃顿建议

使用Void不仅具有更好的语义,而且在空白情况下(略微)更高效,在非空情况下(当你不关心身体时)效率更高.

所以你有了:

Call<Void> deleteBook(@Path("id") int bookId);
Run Code Online (Sandbox Code Playgroud)

用法:

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
    }
});
Run Code Online (Sandbox Code Playgroud)

如果你关心的只是响应代码并且没有响应的主体,那就更好了

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