Retrofit リクエストの本文に生の JSON 全体を POST するにはどうすればよいでしょうか? 質問する

Retrofit リクエストの本文に生の JSON 全体を POST するにはどうすればよいでしょうか? 質問する

この質問は以前にもされたことがあるかもしれませんが、明確な回答はありませんでした。Retrofit リクエストの本文内に生の JSON 全体を投稿するには、具体的にどうすればよいのでしょうか?

同様の質問を見るここそれともこの答えは正しいのでしょうかフォームURLをエンコードし、フィールドとして渡す必要があります? そうならないことを心から願っています。私が接続しているサービスは、投稿の本文に生の JSON を期待しているだけです。JSON データの特定のフィールドを探すようには設定されていません。

この点について、他の専門家と明確にしておきたいと思います。1 人は Retrofit を使用しないようにと答えました。もう 1 人は構文がよくわかりませんでした。別の人は、フォームを URL エンコードしてフィールドに配置した場合に限り、実行できると考えています (これは私のケースでは受け入れられません)。いいえ、Android クライアントのすべてのサービスを再コーディングすることはできません。また、主要なプロジェクトでは、フィールド プロパティ値として JSON コンテンツを渡すのではなく、生の JSON を投稿することが非常に一般的です。正しく理解して、次に進みましょう。これを行う方法を示すドキュメントまたは例を誰か示してもらえますか? または、実行できる/実行すべきでない正当な理由を示してください。

更新: 100% 確実に言えることが 1 つあります。Google の Volley ではこれが実行できます。組み込み済みです。Retrofit でも実行できますか?

ベストアンサー1

@Bodyアノテーションは単一のリクエスト本文を定義します。

interface Foo {
  @POST("/jayson")
  FooResponse postJson(@Body FooRequest body);
}

Retrofit はデフォルトで Gson を使用するため、FooRequestインスタンスはリクエストの唯一の本体として JSON としてシリアル化されます。

public class FooRequest {
  final String foo;
  final String bar;

  FooRequest(String foo, String bar) {
    this.foo = foo;
    this.bar = bar;
  }
}

電話をかける:

FooResponse = foo.postJson(new FooRequest("kit", "kat"));

次の本文が生成されます:

{"foo":"kit","bar":"kat"}

Gson ドキュメントオブジェクトのシリアル化の仕組みについてさらに詳しく説明します。

さて、本当に「生の」JSON を本文として自分で送信したい場合 (ただし、この場合は Gson を使用してください!)、次のようにすることもできますTypedInput:

interface Foo {
  @POST("/jayson")
  FooResponse postRawJson(@Body TypedInput body);
}

入力タイプは、「関連付けられた MIME タイプを持つバイナリ データ」として定義されます。上記の宣言を使用して生データを簡単に送信する方法は 2 つあります。

  1. 使用型付きバイト配列生のバイトと JSON MIME タイプを送信するには:

    String json = "{\"foo\":\"kit\",\"bar\":\"kat\"}";
    TypedInput in = new TypedByteArray("application/json", json.getBytes("UTF-8"));
    FooResponse response = foo.postRawJson(in);
    
  2. サブクラス型付き文字列クラスを作成するにはTypedJsonString:

    public class TypedJsonString extends TypedString {
      public TypedJsonString(String body) {
        super(body);
      }
    
      @Override public String mimeType() {
        return "application/json";
      }
    }
    

    そして、#1 と同様にそのクラスのインスタンスを使用します。

おすすめ記事