我正在使用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,我都会收到错误:&#39; *。响应&#39;不是有效的响应正文类型。你的意思是ResponseBody吗?
有人可以给我一个成功的删除示例吗?我在网上搜索但找不到足够的信息。非常感谢。
答案 0 :(得分:17)
正如你上次提到的那样这样做:
function authenticationservice($http, $location, authenticationFactory, $q, GLOBALS, $cookies) {
this.validateUser = function() {
var vm = this;
data = {
"api_token": api_token
};
return $http.post(GLOBALS.url + 'show/employee/' + $cookies.get('employeeid'), data)
.then(function(response) {
var data = response.data;
retrun data;
}, function(err) {
return $q.reject(err);
});
}
}
确保通过AsyncTask或其他一些线程机制从UI线程调用。不确定你之前是否使用过RxJava + Retrofit 2,但这很不错。
ResponseBody对象将返回调用的结果。这是我用于一些不返回实体对象的REST API请求,我关心的只是查看响应代码。
Call<ResponseBody> deleteBook(@Path("id") int bookId);
或者,杰克沃顿建议
使用Void,它不仅具有更好的语义,而且在空的情况下(稍微)更高效,在非空的情况下(当你不关心身体时)效率更高。
所以你有:
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
}
});
用法:
Call<Void> deleteBook(@Path("id") int bookId);
如果您关心的只是响应代码并且没有响应主体
,那就更好了编辑2:省略了正确的回调定义。修正:)