Retrofit 2.0如何删除?

时间:2016-03-27 18:35:05

标签: java android retrofit retrofit2 http-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,我都会收到错误:&#39; *。响应&#39;不是有效的响应正文类型。你的意思是ResponseBody吗?

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

1 个答案:

答案 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:省略了正确的回调定义。修正:)