ナニコレ
Retrofit
でまさかのtext/plain
なレスポンスのAPIを叩けと言われたのでその対処法をまとめます
自分のメモ用です。
使うの?
しっ
GsonConverterFactory + RxJava2CallAdapterFactory
ココらへんは好みでいいと思いますが、今回JSONパーサーは GsonConverterFactory
、
データのコールバックで RxのSingle
を使いたかったので RxJava2CallAdapterFactory
を利用しました。
app/build.gradle
implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofit_version"
implementation 'com.squareup.retrofit2:converter-gson:$retrofit_version'
ApiClientFactory.kt
val builder = Retrofit.Builder()
.baseUrl("https://hogehoge/gefungefun/")
.client(httpClient)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
return builder.build().create(ApiClientInterface::class.java)
ApiClientInterface.kt
interface ApiClientInterface {
@POST("apiUrl")
fun updateData(): Single<String>
}
Repository.kt
fun update(): Single<String> = apiClient.updateData().subscribeOn(Schedulers.newThread())
こんな感じで定義しときましょう。
ScalarsConverterFactory の追加
今回のミソ。 ScalarsConverterFactory
さんです
この人を追加してあげると、単純なStringのデータとしてレスポンスを扱ってくれます。
app/build.gradle
implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofit_version"
implementation 'com.squareup.retrofit2:converter-gson:$retrofit_version'
implementation "com.squareup.retrofit2:converter-scalars:$retrofit_version" // 追加
ApiClientFactory.kt
val builder = Retrofit.Builder()
.baseUrl("https://hogehoge/gefungefun/")
.client(httpClient)
.addConverterFactory(ScalarsConverterFactory.create()) // 追加
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
return builder.build().create(ApiClientInterface::class.java)
これだけで、Repository#update の subscribe:onNext ではただの String
としてデータが扱えます。