REST-JSONを使用したHTTP Post Multipart


88

2つのパラメーターのみを含むHTTP Postマルチパートを受信する必要があります。

  • JSON文字列
  • バイナリファイル

体を設定する正しい方法はどれですか?Chrome RESTコンソールを使用してHTTP呼び出しをテストするので、正しい解決策はJSONパラメータとバイナリファイルの「ラベル」キーを設定することかどうか疑問に思います。

サーバー側では、Resteasy 2.xを使用しています。次のようにMultipart本文を読みます。

@POST
@Consumes("multipart/form-data")
public String postWithPhoto(MultipartFormDataInput  multiPart) {
  Map <String, List<InputPart>> params = multiPart.getFormDataMap();
  String myJson = params.get("myJsonName").get(0).getBodyAsString();
  InputPart imagePart = params.get("photo").get(0);
  //do whatever I need to do with my json and my photo
}

これは方法ですか?特定のcontent-dispositionを識別するキー「myJsonName」を使用してJSON文字列を取得することは正しいですか?1つのHTTPマルチパートリクエストでこれら2つのコンテンツを受信する他の方法はありますか?

前もって感謝します


1
これはどのようなRESTリソースですか?2つの部分はリソースレベルでどのように関係していますか?

実際、画像は別のリソースではなくリソースの「コンポーネント」であるため、このリソースの処理方法は完全にRESTfulではありません。
thermz 2012年

回答:


148

私が正しく理解している場合は、HTTP / RESTコンソールから手動でマルチパートリクエストを作成する必要があります。マルチパート形式は単純です。HTML 4.01仕様に簡単な紹介があります。たとえば、コンテンツにない文字列である境界を考え出す必要がありますHereGoes。リクエストヘッダーを設定しContent-Type: multipart/form-data; boundary=HereGoesます。次に、これは有効なリクエスト本文である必要があります。

--HereGoes
Content-Disposition: form-data; name="myJsonString"
Content-Type: application/json

{"foo": "bar"}
--HereGoes
Content-Disposition: form-data; name="photo"
Content-Type: image/jpeg
Content-Transfer-Encoding: base64

<...JPEG content in base64...>
--HereGoes--

soap-uiでも実際に添付ファイルを追加できます。これにより、実際の投稿の本文とコンテンツタイプを渡す必要がなくなります。
シェーン・リー2014

1
独自の境界線を思いつくための標準化された方法はありますか?
andig 2015年

2
@andig私は何も知りません。おそらくUUIDを使用できますが、それは必ずしも良い考えではありません。通常は、HTTPライブラリが処理します。
Vasiliy Faronov 2015年

リクエストにjsonとbase64データしかないことがわかっている場合は\*、たとえば境界として機能するようなものであってはなりませんか?jsonにもbase64にも存在できません。
DaedalusAlpha 2016年

2
base64を使用してJPEGデータをエンコードする理由 HTTPでは、生のバイトを送信できます。
Alexandre Blin 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.