2016-03-27 18 views
10

Tôi đang sử dụng trang bị thêm 2.0 và tôi đang triển khai tính năng xóa trong ứng dụng Android của mình, tuy nhiên, tôi không thể thực hiện thành công, ai đó có thể đưa ra đề xuất cho tôi không?Trang bị thêm 2.0 cách xóa?

tôi đã cố gắng cả hai:

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

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

tôi nhận được lỗi java.lang.IllegalArgumentException: phương pháp dịch vụ không thể trả về void. cho phương thức LibraryService.deleteBook.

Tôi cũng đã đưa ra một thử về điều này:

Response deleteBook(@Path("id") int bookId); 

Call<Response> deleteBook(@Path("id") int bookId);

dù tôi sử dụng okhttp3.Response hoặc retrofit2.Response, tôi sẽ nhận được lỗi: '* .Response' được không phải là loại nội dung phản hồi hợp lệ. Ý của bạn là ResponseBody?

Ai đó có thể cho tôi ví dụ xóa thành công không? Tôi googled trực tuyến nhưng không thể tìm thấy đủ thông tin. Cảm ơn rất nhiều.

+0

Bạn đang nhập khẩu gì cho chú thích DELETE? Bối rối tại sao yêu cầu phân tích cú pháp dưới dạng GET .... –

+0

@Lucas Rất bối rối, 'import retrofit2.http.DELETE; nhập retrofit2.http.GET; nhập retrofit2.http.POST; nhập retrofit2.http.PUT; nhập retrofit2.http.Path; 'Vì khi tôi triển khai tính năng PUT nhưng cùng một url,' @PUT ("sách/{id}") Gọi updateBook (@Path ("id") int bookId, @Body Book book); 'Tôi nhận được cùng một vấn đề, phương thức yêu cầu phản hồi là" GET " – xiaoyaoworm

+0

Đối với câu hỏi sau, tôi tạo một câu hỏi mới: http://stackoverflow.com/questions/36255825/retrofit-2-0-delete-put- đang không hoạt động – xiaoyaoworm

Trả lời

16

Hãy làm theo cách này khi bạn lưu ý cuối cùng:

Call<ResponseBody> deleteBook(@Path("id") int bookId); 

Hãy chắc chắn rằng bạn thực hiện cuộc gọi tắt UI sợi qua AsyncTask hoặc một số cơ chế luồng khác. Không chắc chắn nếu bạn đã sử dụng RxJava + Retrofit 2 trước đây, nhưng nó là tốt đẹp.

Đối tượng ResponseBody sẽ trả về kết quả từ cuộc gọi. Đó là những gì tôi sử dụng cho một số yêu cầu REST API không trả về một đối tượng thực thể, và tất cả những gì tôi quan tâm là xem xét mã phản hồi.

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 
    } 
}); 

Hoặc, Jake Wharton cho thấy

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).

Vì vậy, bạn có:

Call<Void> deleteBook(@Path("id") int bookId); 

Cách sử dụng:

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 
    } 
}); 

này là tốt hơn nếu tất cả các bạn quan tâm là phản ứng mã và không có nội dung phản hồi

CHỈNH SỬA 2: Bỏ qua định nghĩa gọi lại thích hợp. Đã sửa lỗi :)

+0

Cảm ơn bạn @Lucas. Những công việc này!!!!! Trước khi nhìn thấy câu trả lời của bạn, tôi nghĩ rằng tôi đã thử trên ResponseBody nhưng nhận được thất bại. Không chắc phần nào tôi đã làm sai.Có, bạn là đúng, tôi nghĩ rằng tôi nên đặt nó vào AsyncTask nếu không tìm nạp quá nhiều dữ liệu nó sẽ chặn giao diện người dùng của tôi. RxJava, không chắc chắn nó là gì nhưng tôi sẽ kiểm tra nó. Cảm ơn rất nhiều!!! – xiaoyaoworm

+0

Nó sử dụng lập trình phản ứng để xử lý các yêu cầu mạng như bạn đang làm + một số mô hình lập trình chức năng làm cho mã sạch hơn. RxJava làm cho mạng trong java dễ dàng hơn nhiều cho các nhiệm vụ phức tạp, tôi vẫn tự học nó nhưng rất nhiều công ty đang bắt đầu sử dụng nó và làm cho swtich –

+0

Chương trình không có vấn đề với đề xuất của bạn nhưng tôi có một vấn đề khác. Bởi vì tôi đang làm công việc xóa, nếu gọi như thế này, tôi sẽ nhận được response.code() = 200, và cuốn sách không bị xóa. Tôi đưa ra một thử trên Advanced Rest Cilent, khi xóa thành công, mã phản hồi hiển thị trên phần mở rộng là 204. Bạn có một số ý tưởng về điều này? RxJava có vẻ thú vị, tôi nên xem xét để tìm hiểu nó. Cảm ơn đề xuất của bạn. – xiaoyaoworm

Các vấn đề liên quan