web-dev-qa-db-ja.com

Retrofit 2.0を削除する方法?

私はレトロフィット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ですか?

誰かが私に成功した削除の例を教えてもらえますか?私はオンラインでグーグルで検索しましたが、十分な情報が見つかりません。どうもありがとう。

13
xiaoyaoworm

最後に書き留めたように、次のようにします。

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

AsyncTaskまたはその他のスレッド化メカニズムを介して、UIスレッドから呼び出しを行うようにしてください。以前にRxJava + Retrofit 2を使用したことがあるかどうかはわかりませんが、それは素晴らしいことです。

ResponseBodyオブジェクトは、呼び出しの結果を返します。これは、エンティティオブジェクトを返さない一部のREST APIリクエストに使用するものであり、気になるのは応答コードを確認することだけです。

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:適切なコールバック定義を省略しました。修繕 :)

18
Lucas Crawford