Модернизация 2.0 как удалить?

Я использую 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, я получу ошибку: '*. Response' не является допустимым типом тела ответа. Вы имели в виду ResponseBody?

Может ли кто-нибудь дать мне успешный пример удаления? Я googled онлайн, но не могу найти достаточно информации. Большое спасибо.

Ответ 1

Сделайте это так, как вы отметили последнее:

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

Убедитесь, что вы отключили UI-поток через AsyncTask или какой-либо другой механизм потоковой передачи. Не уверен, что раньше вы использовали RxJava + Retrofit 2, но это хорошо.

Объект ResponseBody вернет результаты вызова. Это то, что я использую для некоторых запросов API REST, которые не возвращают объект сущности, и все, о чем я забочусь, просматривает код ответа.

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

Или, Джейк Уортон предлагает

Используйте Void, который не только имеет лучшую семантику, но (немного) более эффективен в пустом случае и значительно более эффективен в непустом случае (когда вы просто не заботитесь о теле).

Итак, у вас есть:

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

Использование:

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

Это лучше, если все, о чем вы заботитесь, - это код ответа, а тело - ответ

ИЗМЕНИТЬ 2: Исключить правильное определение обратного вызова. Исправлено:)