55

この質問では、Amazon API Gateway から AWS Lambda にクエリ文字列またはルート パラメータを渡す方法

API ゲートウェイを使用してクエリ文字列パラメータを AWS ラムダにマッピングする方法を示します。同じことをしたいのですが、クエリ文字列の代わりに POST 値をマッピングします。私は試した:

{
    "values": "$input.params()"
}

うまくいきませんでした。実際のフォームデータは表示されません。ところで、私は以下を使用して投稿しています:

application/x-www-form-urlencoded

私は自分のラムダ関数から応答を得ているので、ラムダをうまく呼び出していることはわかっていますが、私の問題は、POST パラメータがどこにも表示されないことです。それらをマッピングする方法がわかりません。Lambda 側で取得したものをすべてダンプすると、次のようになります。

 {"values":"{path={}, querystring={}, header={Accept=*/*, Accept-Encoding=gzip, deflate, Accept-Language=en-US,en;q=0.8, Cache-Control=no-cache, CloudFront-Forwarded-Proto=https, CloudFront-Is-Desktop-Viewer=true, CloudFront-Is-Mobile-Viewer=false, CloudFront-Is-SmartTV-Viewer=false, CloudFront-Is-Tablet-Viewer=false, CloudFront-Viewer-Country=US, Content-Type=application/x-www-form-urlencoded, Origin=chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop, Postman-Token=7ba28698-8753-fcb1-1f48-66750ce12ade, Via=1.1 6ba5553fa41dafcdc0e74d152f3a7a75.cloudfront.net (CloudFront), X-Amz-Cf-Id=sc8C7dLcW0BHYopztNYrnddC0hXyFdBzHv0O9aWU1gKhd1D_J2HF3w==, X-Forwarded-For=50.196.93.57, 54.239.140.62, X-Forwarded-Port=443, X-Forwarded-Proto=https}}"}
4

11 に答える 11

22

AWS Lambda が受信できるように統合設定でマッピング テンプレートを設定することにより、任意のリクエスト ボディ データを有効な JSON 形式に変換できます。

現在、Amazon API Gateway は application/x-www-form-urlencoded を公式にはまだサポートしていないようですが、avilewinはそれを行うためのソリューションを AWS フォーラムに投稿しました。マッピング テンプレートではVelocity Template Language (VTL)を使用できるため、必要なことは、application/x-www-form-urlencoded 形式を有効な JSON 形式に変換するマッピング テンプレートを構成することです。もちろん、これは汚い解決策ですが、今のところこれが唯一の方法だと思います。

于 2015-08-18T01:59:02.413 に答える
11

API ゲートウェイ テンプレートを使用してパラメーターを JSON に変換できます: https://forums.aws.amazon.com/thread.jspa?messageID=673012&tstart=0#673012

または、QueryString パーサー パッケージを使用してラムダ関数自体でこれを行うこともできます: https://www.npmjs.com/package/qs

var qs = require('qs');
var obj = qs.parse('a=c');  // { a: 'c' } 

Amazon がそのような機能の組み込みサポートを追加する場合、私はそれを使用しますが、それまでは、問題が発生した場合にクリーンでデバッグしやすい 2 番目の方法を個人的に好みます。

2017 年 7 月の更新:

デフォルトでサポートされているプロキシ統合を使用できます: http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html

于 2016-01-17T23:18:15.043 に答える
5

この最小限の作業コードを見つけるのに少し時間がかかったので、共有する価値があると思う本当に簡単な解決策を見つけました。

コンテンツ タイプが application/x-www-form-urlencoded のデータを送信する一般的なフォームがある場合は、「Lambda プロキシ統合」にフラグを付けるだけで、Node.js で解析できる event.body にエンコードされたフォーム データが見つかります。クエリ文字列ネイティブ モジュール。

const querystring = require('querystring')

function handler (event, context, callback) {
  // Read form data.
  const { user, pass } = querystring.parse(event.body)

  // Follows your code to handle request.
}
于 2018-03-26T21:34:50.370 に答える
1

投稿された値の順序付けられた辞書を返す単純な関数:

import urllib
from collections import OrderedDict
postdata = ''

def GetPostData(body):
    #postdata = OrderedDict()
    postdata = {}
    for items in body.split('&'):
        vals = items.split('=')
        postdata[vals[0]] = urllib.parse.unquote(vals[1])
    return postdata

#Testing it out:
#Assume you get body from event['body'] or body = event.get['body']
body = 'text=This%20works%20really%20well%21%245123%21%403%2146t5%40%2341&anotherkey=isawesome23412%201%21%403%21%40312'

postdata = GetPostData(body)
print(postdata['text'])
#returns 'This works really well!$5123!@3!46t5@#41'
print(postdata['anotherkey'])
#returns 'isawesome23412 1!@3!@312'

投稿されたアイテムが見つからない場合のキー エラーを回避するには、代わりに value = postdata.get('') を使用する必要があります。キーが存在しない場合、値は None になるためです。

于 2018-09-18T23:37:10.870 に答える