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