2016-03-27 28 views
10

Uso il retrofit 2.0 e sto implementando una funzione di eliminazione nella mia app per Android, tuttavia, non riesco a farlo correttamente, qualcuno può darmi un suggerimento?Retrofit 2.0 come eliminare?

Ho provato entrambi:

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

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

ottengo l'errore java.lang.IllegalArgumentException: metodi di servizio non possono tornare vuoto. per metodo LibraryService.deleteBook.

ho anche dato una prova su questo:

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

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

non importa che uso okhttp3.Response o retrofit2.Response, mi metterò l'errore: '* .Response' è non è un tipo di corpo risposta valido. Intendevi ResponseBody?

Qualcuno può darmi un esempio di cancellazione riuscito? Ho cercato su Google online ma non riesco a trovare abbastanza informazioni. Molte grazie.

+0

Quale importazione stai utilizzando per l'annotazione DELETE? Confuso perché la richiesta lo analizza come GET .... –

+0

@Lucas Molto confuso ora, 'import retrofit2.http.DELETE; import retrofit2.http.GET; import retrofit2.http.POST; import retrofit2.http.PUT; import retrofit2.http.Path; 'Perché quando implemento la funzionalità PUT ma lo stesso url,' @PUT ("books/{id}") Call updateBook (@Path ("id") int bookId, @Body Book book); "Ottengo lo stesso problema, il metodo di richiesta di risposta è" GET " – xiaoyaoworm

+0

Per la seguente domanda, creo una nuova domanda: http://stackoverflow.com/questions/36255825/retrofit-2-0-delete-put- non funziona – xiaoyaoworm

risposta

16

farlo in questo modo come avrete notato ultima:

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

Assicurarsi si effettua la chiamata al largo della UI-thread tramite AsyncTask o qualche altro meccanismo threading. Non sono sicuro se hai già usato RxJava + Retrofit 2, ma è bello.

L'oggetto ResponseBody restituirà i risultati della chiamata. È ciò che utilizzo per alcune richieste API REST che non restituiscono un oggetto entità e tutto ciò a cui tengo è il codice di risposta.

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

Oppure, Jake Wharton suggerisce

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

In modo da avere:

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

Usage:

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

Questo è meglio se tutto ciò che interessa è la risposta codice e nessun corpo alla risposta

MODIFICA 2: omettendo la corretta definizione di richiamata. Risolto :)

+0

Grazie @ Lucas. Funziona !!!!! Prima di vedere la tua risposta, penso di aver provato su ResponseBody ma ho fallito. Non sono sicuro di quale parte ho sbagliato.Sì, hai ragione, penso che dovrei inserirlo in AsyncTask altrimenti se raccolgo troppi dati bloccherà la mia interfaccia utente. RxJava, non sono sicuro di cosa sia questo, ma lo controllerò. Molte grazie!!! – xiaoyaoworm

+0

Utilizza la programmazione reattiva per gestire le richieste di rete come si sta facendo + alcuni paradigmi di programmazione funzionale che rendono il codice più pulito. RxJava rende il networking in Java molto più facile per compiti complicati, lo sto ancora imparando da solo ma molte aziende stanno iniziando a usarlo e fanno lo swtich –

+0

Il programma non ha problemi con il tuo suggerimento ma ho un altro problema. Perché sto facendo cancellare il lavoro, se la chiamata in questo modo, otterrò response.code() = 200, e il libro non viene eliminato. Ho provato su Advanced Rest Cilent, quando cancella con successo, il codice di risposta mostrato nell'estensione è 204. Hai qualche idea su questo? RxJava sembra interessante, dovrei dare un'occhiata per impararlo. Grazie per il tuo suggerimento – xiaoyaoworm

Problemi correlati