2

サーバーレスフレームワークを試し始めましたが、いくつかの点で少し混乱しているように見えます...それらの1つはリクエストヘッダー/クエリ文字列です。

次のようなリクエスト テンプレートを作成しました。

s-templates.json

{
  "apiRequestTemplate": {
    "application/json": {
      "httpMethod": "$context.httpMethod",
      "body": "$input.json('$')",
      "queryParams" : "$input.params().querystring",
      "headerParams" : "$input.params().header",
      "headerParamNames" : "$input.params().header.keySet()",
      "contentTypeValue" : "$input.params().header.get('Content-Type')"
    }
  }
}

s-function.json

  "requestParameters": {},
  "requestTemplates": "$${apiRequestTemplate}",

この設定では、次のようなリクエストを受け取ることを期待していました。

{
  "body" : {}
  "contentTypeValue" : ""
  "headerParamNames" : ["Accept", "Accept-Encoding", ... ],
  "headerParams" : {
    "Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Encoding" : "gzip, deflate, sdch, br, Accept-Language=ja,en-US;q=0.8,en;q=0.6", 
    ...
  },
  "httpMethod" : "GET",
  "queryParams" : {
    "category" : "Some Category"
  }
}

しかし、実際には、私が得るものは次のとおりです。

{
  "body" : {}
  "contentTypeValue" : ""
  "headerParamNames" : "[Accept,Accept-Encoding, ... ]",
  "headerParams" : "{Accept=text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", Accept-Encoding=gzip, deflate, sdch, br, Accept-Language=ja,en-US;q=0.8,en;q=0.6", ...}",
  "httpMethod" : "GET",
  "queryParams" : "{category=Some Category}"
}

このため、取り扱いが不便である。

私も知っています、以下のような方法:

s-function.json

  "requestParameters": {},
  "requestTemplates": {
    "application/json": "{\"category\":\"$input.params('category')\"}"
  },

しかし、これは、構成ですべてのパラメーターを指定する必要があるという不便でもあります..

リクエストヘッダー/クエリ文字列全体をラムダ関数のjsonオブジェクトとして取得する方法はありますか?

回答後に修正

s-template.json を次のように変更しようとしました

  "queryParams" : "$util.parseJson($input.params().querystring)",
  "headerParams" : "$util.parseJson($input.params().header)",

しかし、結果は同じでした...

そして、AWS ドキュメントでは、私が望むものはここで見ることができます: http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#input-variable-reference

#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
  }
}

しかし、この設定をサーバーレス フレームワークの s-templates.json に設定する方法がわかりません...

4

2 に答える 2

2

次のリクエストテンプレートを使用します。データ、パス、ヘッダー、パラメーター、クエリを JSON オブジェクトにラップし、関数に渡します。

{
    "application/json": {
        "data": "$input.json('$')",
        "path": "$context.resourcePath",
        "method": "$context.httpMethod",
        "headers": "{#foreach($header in $input.params().header.keySet())\"$header\": \"$util.escapeJavaScript($input.params().header.get($header))\" #if($foreach.hasNext),#end#end}",
        "params": "{#foreach($param in $input.params().path.keySet())\"$param\": \"$util.escapeJavaScript($input.params().path.get($param))\" #if($foreach.hasNext),#end#end}",
        "query": "{#foreach($queryParam in $input.params().querystring.keySet())\"$queryParam\": \"$util.escapeJavaScript($input.params().querystring.get($queryParam))\" #if($foreach.hasNext),#end#end}"          
    }
}

Apache Velocity Templates を参照して、 などの内部構文について理解を深めることができます#foreach($header in .....)

于 2016-06-29T06:22:10.867 に答える
-1

試しました$util.parseJson()か?json を文字列として受け取り、それを従来の json オブジェクトに変換します。

于 2016-06-14T18:51:09.030 に答える