Retrofit2を使用して生のJSONを投稿する

Aug 17 2020

別のアプリケーションから大きなJSONオブジェクトを受け取ったので、Retrofit 2を使用してAPIをポストコールする必要があります。このトピックで見つけたすべての例またはトピックは、JSONObjectまたはMapを使用しています。つまり、JSONObjectまたはMapを作成するには、文字列(JSON)を解析する必要があります。

でもどういうわけか自分の弦を直接体に入れたいです。

私はこの方法を試しましたが、機能しません:

@Headers("Content-Type: application/json")
@POST("transactions")
Call<Void> submitTransaction(@Body String body);

このようにして、本文としてエスケープされた文字列を送信していますが、JSONが奇妙に見えます:スクリーンショット

回答

1 Nemanja Aug 17 2020 at 22:07

RetrofitはデフォルトでGsonコンバーターを使用するため、Gradle依存関係のリストにScalarsConverterを追加する必要があります。これによりjava.lang.Stringオブジェクトからtext / plainリクエストボディへの変換が処理されます。最新バージョンについては、このリンクを確認してください。

https://search.maven.org/search?q=g:com.squareup.retrofit2%20a:converter-scalars

dependencies {
    implementation “com.squareup.retrofit2:converter-scalars:2.4.0”
    ..
}

次に、正しいコンバーターファクトリをRetrofitビルダーに渡す必要があります。後で、サービスに渡された@Bodyパラメーターを変換する方法をRetrofitに指示します。

val retrofit = Retrofit.Builder()
        .client(okHttpClient)
        .baseUrl("/")
        .addConverterFactory(ScalarsConverterFactory.create())
        .build()

この後、Stringbodyパラメーターを使用してRetrofitサービスをセットアップします。

@Headers("Content-Type: application/json")
@POST("transactions")
Call<Void> submitTransaction(@Body String body);