2016-03-27 10 views
10

Używam retrofitu 2.0 i implementuję funkcję usuwania w mojej aplikacji na Androida, ale nie mogę jej pomyślnie wykonać, czy ktoś może dać mi sugestię?Retrofit 2.0 jak usunąć?

Próbowałem zarówno:

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

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

otrzymuję błąd java.lang.IllegalArgumentException: metody usługa nie może powrócić nieważne. dla metody LibraryService.deleteBook.

Dałem szansę na to:

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

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

nieważne używam okhttp3.Response lub retrofit2.Response będę pojawia się błąd: '*' oznacza .Response niepoprawny typ treści odpowiedzi. Czy chodziło Ci o ResponseBody?

Czy ktoś może mi podać przykład udanego usunięcia? Mam google online, ale nie mogę znaleźć wystarczających informacji. Wielkie dzięki.

+0

Jakiego importu używasz do adnotacji DELETE? Pomylić, dlaczego wniosek przetwarza go jako GET .... –

+0

@ Lucas Bardzo mylić teraz, 'import retrofit2.http.DELETE; importuj retrofit2.http.GET; import retrofit2.http.POST; import retrofit2.http.PUT; importuj retrofit2.http.Path; 'Ponieważ gdy zaimplementuję funkcję PUT, ale ten sam URL,' @PUT ("books/{id}") Zadzwoń pod updateBook (@Path ("id") int bookId, @Body Book book); 'Mam ten sam problem, metoda żądania odpowiedzi jest" GET " – xiaoyaoworm

+0

Dla następnego pytania, tworzę nowe pytanie: http://stackoverflow.com/questions/36255825/retrofit-2-0-delete-put- nie-pracujący – xiaoyaoworm

Odpowiedz

16

zrobić to w ten sposób, jak zauważył ostatni:

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

Upewnij się nawiązać połączenie wyłączyć UI-gwintu poprzez AsyncTask lub innego mechanizmu nawlekania. Nie jestem pewien, czy korzystałeś wcześniej z RxJava + Retrofit 2, ale jest to miłe.

Obiekt ResponseBody zwróci wyniki z połączenia. To jest to, czego używam dla niektórych żądań API REST, które nie zwracają obiektu encji i wszystko, na czym mi zależy, polega na sprawdzaniu kodu odpowiedzi.

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

Albo Jake Wharton sugeruje

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

Więc trzeba:

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

Zastosowanie:

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

Jest lepiej, jeśli wszystko, co dbają o to odpowiedź kod i brak treści do odpowiedzi

EDYCJA 2: Pominięto właściwą definicję wywołania zwrotnego. Naprawiono :)

+0

Dziękuję @ Lucas. To działa!!!!! Zanim zobaczę twoją odpowiedź, myślę, że spróbowałem na ResponseBody, ale dostaję porażkę. Nie jestem pewien, która część popełniłem błąd.Tak, masz rację, myślę, że powinienem umieścić go w AsyncTask, w przeciwnym razie, jeśli pobieranie zbyt dużej ilości danych zablokuje mój interfejs. RxJava, nie jestem pewien co to jest, ale sprawdzę to. Wielkie dzięki!!! – xiaoyaoworm

+0

Używa programowania reaktywnego do obsługi żądań sieciowych, takich jak robisz + kilka funkcjonalnych paradygmatów programowania, które czynią kod czystszym. RxJava sprawia, że ​​tworzenie sieci w Javie jest znacznie łatwiejsze w przypadku skomplikowanych zadań, nadal uczę się go sam, ale wiele firm zaczyna z niego korzystać i tworzy swtich –

+0

Program nie ma problemu z twoją sugestią, ale mam inny problem. Ponieważ robię usuwanie, jeśli wywołuję w ten sposób, otrzymam response.code() = 200, a książka nie zostanie usunięta. Próbuję wypróbować Advanced Rest Cilent, kiedy kasowanie powiodło się, kod odpowiedzi pokazany na rozszerzeniu to 204. Czy masz jakiś pomysł na ten temat? RxJava brzmi interesująco, powinienem rzucić okiem, aby się tego nauczyć. Dzięki za Twoją sugestię. – xiaoyaoworm