web-dev-qa-db-ja.com

AWS API Gateway:フォームデータのサポート

Content-Type:multipart/form-dataでリクエストをAPI Gatewayに送信することは可能ですか?

私の場合、Postman経由で以下のようなフォームデータを送信しようとしています。

user[email]:[email protected]
user[password]:password
user[password_confirmation]:password
user[username]:testUser

しかし、APIGatewayはコンテンツを失っているようです。

application/x-www-form-urlencodedまたはapplication/jsonとして送信すると、すべて正常に機能します。

7
nicq

mulipart/form-dataの使用は、特にmulipart/form-dataを介してファイルを送信しようとする場合、AWS APIGatewayでは完全にはサポートされていません。

フォームから他のデータと一緒に画像を送信するには、おそらく最良の解決策は、画像がbase64でエンコードされているJSONとして送信することです。

たとえば、誰かが送信したい場合:

  1. ユーザー名(文字列)
  2. アバター(画像)

アバターはbase64でエンコードする必要があります。次のように、画像をテキストとして表示します。

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyA...

POSTメッセージの内容は次のようになります:

{
    "user_account": {
           "avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyA...",
           "username": "my name"
    }
}

APIゲートウェイ

API Gatewayで、APIの下でModelsを開き、新しいモデルを作成します。たとえば、serAccount

{
   "$schema": "http://json-schema.org/draft-04/schema#",
   "title": "UserAccountUpdate",
   "type": "object",
   "properties": {
   "user": {
      "type": "object",
      "properties": {
          "avatar": { "type": "string" },
          "username": { "type": "string" }
     }
   }
  }
}

In メソッドリクエスト-> HTTPリクエストヘッダーセット:Content-Type

In メソッドリクエスト-> リクエストボディセット:application/jsonそしてモデルの使用として作成されたserAccountモデル。

統合リクエスト-> コンテンツ処理として設定:パススルー。

統合リクエスト-> ボディマッピングテンプレート選択:reuqest Content-Typeヘッダーに一致するテンプレートがない場合。 (ここで他の2つのオプションを使用して、追加のマッピングテンプレートを設定することもできます)。

バックエンド

バックエンドは、base64でエンコードされたテキストとして画像を受け取ります。したがって、おそらくそれ以上使用する前に、テキストから画像にデコードする必要があります。

Base64を使用した画像のエンコード/デコードは非常に人気があるため、フレームワークに適切なツール/ライブラリを見つける必要があります。

8
nicq

Content-Type:multipart/form-data to API Gatewayを使用してリクエストを送信する場合は、元のContent-Typeヘッダーを統合エンドポイントに渡す必要があります。

aws apigateway update-integration \
     --rest-api-id a1b2c3d4e5 \
     --resource-id a1b2c3 \
     --http-method POST \
     --patch-operations op='replace',path='/requestParameters/integration.request.header.Content-Type',value='method.request.header.Content-Type'
1
Ka Hou Ieong