438

たとえば、使用したい場合

GET /user?name=bob

また

GET /user/bob

これらの例の両方をパラメーターとして Lambda 関数に渡すにはどうすればよいでしょうか?

ドキュメントで「マップ元」の設定について何かを見ましたが、API Gateway コンソールでその設定を見つけることができません。

  • method.request.path.parameter-nameparameter-nameメソッドリクエストページで定義された名前のパスパラメータ。
  • method.request.querystring.parameter-nameparameter-nameメソッドリクエストページで定義された名前のクエリ文字列パラメータ。

クエリ文字列を定義したにもかかわらず、これらのオプションのいずれも表示されません。

4

22 に答える 22

232

これを機能させる手順は次のとおりです。

API Gateway コンソール内で ...

  1. に行くResources -> Integration Request
  2. テンプレート ドロップダウンの横にあるプラス アイコンまたは編集アイコンをクリックします (テンプレート フィールドが既に開いていて、ここのボタンがグレー表示されているため、奇妙なことにわかります)。
  3. デフォルトが表示されていても、コンテンツ タイプ フィールドに明示的に入力application/jsonします (これを行わないと保存されず、エラー メッセージも表示されません)。
  4. これを入力マッピングに入れます{ "name": "$input.params('name')" }

  5. テンプレートのドロップダウンの横にあるチェックボックスをクリックします(これが最終的に保存されると思います)

于 2015-07-10T15:48:07.013 に答える
44

These days a drop-down template is included in the API Gateway Console on AWS.

For your API, click on the resource name... then GET

Expand "Body Mapping Templates"

Type in

application/json

for Content-Type (must be explicitly typed out) and click the tick

A new window will open with the words "Generate template" and a dropdown (see image).

Select

Method Request passthrough

enter image description here

Then click save

To access any variables, just use the following syntax (this is Python) e.g. URL:

https://yourURL.execute-api.us-west-2.amazonaws.com/prod/confirmReg?token=12345&uid=5

You can get variables as follows:

from __future__ import print_function

import boto3
import json

print('Loading function')


def lambda_handler(event, context):
    print(event['params']['querystring']['token'])
    print(event['params']['querystring']['uid'])

So there is no need to explicitly name or map each variable you desire.

于 2016-04-19T11:48:11.830 に答える
26

受け入れられた答えは私にとってはうまくいきましたが、gimeneteの答えを拡張して、すべてのクエリ/パス/ヘッダーパラメーターを(今のところ文字列として)渡すために使用できる汎用テンプレートが必要でした。次のテンプレートを思いつきました。誰かが役に立つと思った場合に備えて、ここに投稿しています。

#set($keys = [])
#foreach($key in $input.params().querystring.keySet())
  #set($success = $keys.add($key))
#end

#foreach($key in $input.params().headers.keySet())
  #if(!$keys.contains($key))
    #set($success = $keys.add($key))
  #end
#end

#foreach($key in $input.params().path.keySet())
  #if(!$keys.contains($key))
    #set($success = $keys.add($key))
  #end
#end

{
#foreach($key in $keys)
  "$key": "$util.escapeJavaScript($input.params($key))"#if($foreach.hasNext),#end
#end
}
于 2015-10-18T15:53:36.743 に答える
20

ここで私自身の質問の 1 つに答えようとする一環として、このトリックに出くわしました。

API Gateway マッピング テンプレートで、次を使用して、HTTP クライアントから送信された完全なクエリ文字列を取得します。

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

利点は、クエリ文字列で定義済みのマップされたキーのセットに自分自身を制限する必要がないことです。これを処理したい場合は、クエリ文字列で任意のキーと値のペアを受け入れることができるようになりました。

注:このによると、VTL テンプレートで使用できる変数としてのみ$input.params(x)がリストされています。内部が変更され、querystring利用できなくなる可能性があります。

于 2015-08-06T13:32:46.947 に答える
14

これで、マッピングを構成するのではなく、Lambda の新しいプロキシ統合タイプを使用して、完全なリクエストを標準形式で自動的に取得できるようになります。

参照: http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-set-up-lambda-proxy-integration-on-プロキシ リソース

于 2016-09-27T17:01:32.243 に答える
8

ここでの多くの答えは素晴らしいです。でももう少しシンプルなものが欲しかった。無料の「Hello World」サンプルで動作するものが欲しかったのです。これは、クエリ文字列に一致するリクエスト本文を単純に生成する必要があることを意味します。

{
#foreach($param in $input.params().querystring.keySet())
  "$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end
#end
}

一番上の答えは、実際のものを構築するときにもっと便利なものを生み出すと思いますが、AWS のテンプレートを使用してすばやく Hello World を実行するには、これはうまく機能します。

于 2016-05-13T11:04:21.057 に答える
6

クエリ文字列は、ラムダの JavaScript で簡単に解析できます。

GET /user?name=bob の場合

 var name = event.queryStringParameters.name;

ただし、これは GET user/bob の質問を解決しません。

于 2016-06-13T01:57:41.440 に答える
6

次のパラメーター マッピングの例では、JSON ペイロードを介して、パス、クエリ文字列、ヘッダーを含むすべてのパラメーターを統合エンドポイントに渡します。

#set($allParams = $input.params())
{
  "params" : {
    #foreach($type in $allParams.keySet())
    #set($params = $allParams.get($type))
    "$type" : {
      #foreach($paramName in $params.keySet())
      "$paramName" : "$util.escapeJavaScript($params.get($paramName))"
      #if($foreach.hasNext),#end
      #end
    }
    #if($foreach.hasNext),#end
    #end
  }
}

実際には、このマッピング テンプレートは、次のように、ペイロード内のすべての要求パラメーターを出力します。

{
  "parameters" : {
     "path" : {    
       "path_name" : "path_value", 
       ...
     }
     "header" : {  
       "header_name" : "header_value",
       ...
     }
     'querystring" : {
       "querystring_name" : "querystring_value",
       ...
     }
   }
}

Amazon API Gateway 開発者ガイドからコピー

于 2016-08-21T20:28:37.643 に答える
2

Python 3.8 with boto3 v1.16v - 2020 年 12 月

ルートを構成するには、ルートを受け入れるように API Gateway を構成する必要があります。そうしないと、ベース ルート以外のすべてのものが {missing auth token} またはその他のものになります...

ルートを受け入れるように API Gateway を構成したら、ラムダ プロキシが有効になっていることを確認してください。

ルートにアクセスするには、

new_route = event['path'] # /{some_url}

クエリパラメータにアクセスする

query_param = event['queryStringParameters'][{query_key}]
于 2020-12-29T12:57:53.983 に答える
0

私の目標は、次のようなクエリ文字列を渡すことでした。

 protodb?sql=select * from protodb.prototab

API ゲートウェイから URL を介して Node.js 12 Lambda 関数に送信します。私は他の回答からいくつかのアイデアを試しましたが、可能な限り最も API ゲートウェイ UI ネイティブな方法で何かをしたかったので、私のために働いたこれを思いつきました (2020 年 12 月の API ゲートウェイの UI の時点で)。 :

特定の API の API Gateway コンソールで、リソースの下にある get メソッドを選択します。次に、統合リクエストを選択し、ページの上部にあるラムダ関数のデータを入力します。

一番下までスクロールして、マッピング テンプレート セクションを開きます。テンプレートが定義されていない場合は、[リクエスト ボディ パススルー] を選択します (推奨)。

[マッピング テンプレートの追加] をクリックし、コンテンツ タイプが application/json のテンプレートを作成して、チェック マーク ボタンをクリックします。

そのマッピング テンプレートの場合、テンプレートを生成するためのドロップ ダウン リストでメソッド リクエスト パススルーを選択します。これにより、その下のテキスト ボックスにすべてを渡すための AWS の一般的な方法が入力されます。

保存ボタンを押します。

テストしたところ、Lambda 関数のノード JS の下にある event.sql としてパラメーターを取得できませんでした。API ゲートウェイが URL sql クエリ パラメータを Lambda 関数に送信すると、Node.js に対して次のように送信されることがわかります。

 var insql = event.params.querystring.sql;

そのため、少し時間がかかったトリックは、JSON.stringify を使用して完全なイベント スタックを表示し、セクションを下って、クエリ文字列から sql パラメーターを取得できるようにすることでした。

したがって、基本的には、API ゲートウェイでデフォルトのパススルー機能を使用できます。秘訣は、Lambda 関数にいるときにパラメーターがどのように渡されるかです。

于 2020-12-15T22:00:23.707 に答える