Amazon web services 如何在无服务器框架中获取整个请求头/查询字符串?
我开始尝试无服务器框架,但在某些方面它看起来有点容易混淆。。。 其中之一是请求头/查询字符串 我制作了如下请求模板:Amazon web services 如何在无服务器框架中获取整个请求头/查询字符串?,amazon-web-services,aws-lambda,serverless-framework,Amazon Web Services,Aws Lambda,Serverless Framework,我开始尝试无服务器框架,但在某些方面它看起来有点容易混淆。。。 其中之一是请求头/查询字符串 我制作了如下请求模板: { "body" : {} "contentTypeValue" : "" "headerParamNames" : ["Accept", "Accept-Encoding", ... ], "headerParams" : { "Accept" : "text/html,application/xhtml+xml,application/xml;q=0.
{
"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-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')"
}
}
}
"requestParameters": {},
"requestTemplates": "$${apiRequestTemplate}",
s-function.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')"
}
}
}
"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')\"}"
},
但这也不方便,因为需要在配置中指定所有参数
有没有办法在lambda函数中将整个请求头/查询字符串作为json对象获取
回答后修改
我尝试将s-template.json更改为
"queryParams" : "$util.parseJson($input.params().querystring)",
"headerParams" : "$util.parseJson($input.params().header)",
但结果是一样的
在AWS文档中,我想要的可以在这里看到:
但我不知道如何将此设置设置为无服务器框架的s-templates.json…您尝试过吗?它将json作为字符串,并将其转换为传统的json对象。我使用以下请求模板。它将把数据、路径、头、参数、查询包装成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}"
}
}
您可以参考ApacheVelocity模板来更好地理解内部语法,例如#foreach($header in…)