Java 改装2.0如何删除?

Java 改装2.0如何删除?,java,android,retrofit,retrofit2,http-delete,Java,Android,Retrofit,Retrofit2,Http Delete,我正在使用改型2.0,我在我的Android应用程序中实现了一个删除功能,但是,我无法成功实现,有人能给我一个建议吗 我尝试了两种方法: @DELETE("books/{id}") void deleteBook(@Path("id") int itemId); @DELETE("books/{id}") void deleteBook(@Path("id") int bookId, Callback<Response> callback); 调用deleteBook(@Path

我正在使用改型2.0,我在我的Android应用程序中实现了一个删除功能,但是,我无法成功实现,有人能给我一个建议吗

我尝试了两种方法:

@DELETE("books/{id}") void deleteBook(@Path("id") int itemId);

@DELETE("books/{id}") void deleteBook(@Path("id") int bookId, Callback<Response> callback);
调用deleteBook(@Path(“id”)intbookid)

无论我使用okhttp3.Response还是Reformation2.Response,我都会得到错误:“*.Response”不是有效的响应主体类型。你是说ResponseBody吗?


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

按照您上次提到的方法进行操作:

Call<ResponseBody> deleteBook(@Path("id") int bookId);
调用deleteBook(@Path(“id”)intbookid);
确保通过AsyncTask或其他线程机制取消UI线程。不确定您以前是否使用过RxJava+改型2,但它很好

ResponseBy对象将返回调用的结果。我使用它来处理一些不返回实体对象的RESTAPI请求,我所关心的只是查看响应代码

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
    }
});
调用deleteRequest=mService.deleteBook(123); deleteRequest.enqueue(新回调(){ @凌驾 公共void onResponse(调用、响应){ //使用response.code、response.headers等。 } @凌驾 失败时公共无效(调用调用,可丢弃的t){ //处理失败 } });
或者,杰克·沃顿建议

使用Void,它不仅具有更好的语义,而且在空的情况下(稍微)更有效,在非空的情况下(当您不关心body时)更有效

所以你有:

Call<Void> deleteBook(@Path("id") int bookId);
调用deleteBook(@Path(“id”)intbookid);
用法:

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
    }
});
deleteRequest.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
//使用response.code、response.headers等。
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
//处理失败
}
});
如果您只关心响应代码,而不关心响应的主体,那么这会更好


编辑2:省略了正确的回调定义。修正:)

谢谢你@Lucas。这很有效!!!!!在看到你的答案之前,我想我试了一下ResponseBody,但失败了。不知道我错了哪一部分。是的,你是对的,我想我应该把它放到AsyncTask中,否则如果获取太多数据,它会阻塞我的UI。RxJava,不确定这是什么,但我会检查它。谢谢!!!它使用反应式编程来处理网络请求,例如您正在做的事情+一些使代码更干净的函数式编程范例。RxJava使java中的网络更容易处理复杂的任务,我自己仍在学习,但许多公司开始使用它并制作软件。该程序对你的建议没有问题,但我确实有另一个问题。因为我正在做删除工作,如果这样调用,我将得到response.code()=200,并且书不会被删除。我在Advanced Rest Cilent上进行了一次尝试,当删除成功时,扩展名上显示的响应代码是204。你对此有什么想法吗?RxJava听起来很有趣,我应该看看来学习它。谢谢你的建议。是的,@Lucas完全同意你的看法,Void是有意义的,因为我只关心回复代码。响应代码204表示成功,但没有实体作为主体包含(使用回调的更多原因)。我提供的链接说:“服务器已完成请求,但不需要返回实体正文,并且可能希望返回更新的元信息。响应可能以实体头的形式包含新的或更新的元信息,如果存在,则应与请求的变体相关联。”。因此,当您看到响应代码204时,表示您已成功删除。您对删除注释使用了什么导入?困惑为什么请求将其解析为GET…@Lucas现在非常困惑,
import.2.http.DELETE;导入文件2.http.GET;导入文件2.http.POST;导入文件2.http.PUT;导入2.http.Path@PUT(“books/{id}”)调用updateBook(@Path(“id”)int bookId,@Body Book)我遇到了同样的问题,响应请求方法是“get”。对于以下问题,我创建了一个新问题:
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
    }
});