我正在使用 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' is not a valid response body type。您是说 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
}
});
或者, jack 沃顿建议
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:遗漏了正确的回调定义。固定 :)
关于java - Retrofit 2.0怎么删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36251080/