そのため、明確に定義され、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'
次のようにRetrofit
でリクエストメソッドを宣言する必要があります。
_@DELETE(...)
Call<Void> deleteFile(...args);
_
RxJavaでは、Observable
を入力する必要があります。
_@DELETE(...)
Observable<Response<Void>> deleteFile(...args);
_
onNext()
またはdoOnNext()
では、リクエストが成功した場合、通常はResponse
を受け取ります。
Void
があると、さらに逆シリアル化するために応答本文がコンバーターに送信されません。すべての空の応答Call
sはVoid
と入力する必要があります。
RxJava2とレトロフィット2があるので、 Completable
を使用して、エンドポイントから本当に必要なものを説明するためのより読みやすい方法を使用できます。
Completable
は設計上、onComplete()
とonError(Exception)
のみを返すため、表示した瞬間に何が起こっているかがわかります(戻り値ではなく実行のみが重要です)。 Response<Void>
の下に何があるのか不思議ではありません。
したがって、エンドポイント呼び出しは次のようになります。
@DELETE(...)
Completable deleteFile(...args);
より多くのタイプがサポートされています。 Retrofit 2 RxJava 2 Adapter page .Single
は、API呼び出しの点で際立っているものです。