繁体   English   中英

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:服务方法不能返回void。 方法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对象将返回调用的结果。 这是我用于一些不返回实体对象的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:省略了正确的回调定义。 固定:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM