web-dev-qa-db-ja.com

RxJava2 / Retrofit2-204のPUTおよびDELETE要求のnullの処理

そのため、明確に定義され、DELETEおよびPUT操作でペイロード本体を返さないように設計されたAPIを使用しています。

これは、Rx0.XおよびRx1.xで許容されました。現在、Rx 2に更新しており、null値の処理方法に実存的危機があります。もちろん、content-lengthとbodyはnullであり、次の原因になります。

Java.lang.NullPointerException: Null is not a valid element
   at io.reactivex.internal.queue.SpscLinkedArrayQueue.offer(SpscLinkedArrayQueue.Java:68)
   at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.onNext(ObservableObserveOn.Java:116)
   at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.onNext(ObservableSubscribeOn.Java:63)

doOnNextで。

多くの人がOptional<>を提案しているのを見てきましたが、ユースケースの理由からJava7もサポートする必要があります。バックポーティングを試みましたが、うまく機能しませんでした。また、Guavaライブラリを肥大化させてインポートしたくありません。

また、flatMapは、マップとは対照的にこれを処理するのに役立つ可能性があることに気付き、違いを読んでいます。

現在、私は非常に粗雑なOkHttp3インターセプターを持っており、ステータスをチェックし、ペイロードが空かどうかをチェックし、非常に間違っていると感じるダミーコンテンツを追加します。

また、変換ファクトリを追加しようとしました。

誰かが提案を提供し、適切な道が何であるかについて私を導くことができますか?確かに、APIは変更される可能性がありますが、HTTPステータスコードとして定義されているため、204にはペイロードがないはずです。

関連する依存関係

compile('com.squareup.retrofit2:retrofit:2.1.0') {
     exclude module: 'okhttp'
} 
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
compile 'com.squareup.okhttp3:okhttp:3.5.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'

compile 'io.reactivex.rxjava2:rxjava:2.0.5'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.trello.rxlifecycle2:rxlifecycle:2.0.1'
compile 'com.trello.rxlifecycle2:rxlifecycle-components:2.0.1'
13
isuPatches

次のようにRetrofitでリクエストメソッドを宣言する必要があります。

_@DELETE(...)
Call<Void> deleteFile(...args);
_

RxJavaでは、Observableを入力する必要があります。

_@DELETE(...)
Observable<Response<Void>> deleteFile(...args);
_

onNext()またはdoOnNext()では、リクエストが成功した場合、通常はResponseを受け取ります。

Voidがあると、さらに逆シリアル化するために応答本文がコンバーターに送信されません。すべての空の応答CallsはVoidと入力する必要があります。

28

RxJava2とレトロフィット2があるので、 Completable を使用して、エンドポイントから本当に必要なものを説明するためのより読みやすい方法を使用できます。

Completableは設計上、onComplete()onError(Exception)のみを返すため、表示した瞬間に何が起こっているかがわかります(戻り値ではなく実行のみが重要です)。 Response<Void>の下に何があるのか​​不思議ではありません。

したがって、エンドポイント呼び出しは次のようになります。

@DELETE(...)
Completable deleteFile(...args);

より多くのタイプがサポートされています。 Retrofit 2 RxJava 2 Adapter page .Singleは、API呼び出しの点で際立っているものです。

12
MatBos