AWS API 网关:传递所有参数
AWS API Gateway: Pass through all parameters
我正在使用 API Amazon 中的网关作为后端 api 的简单代理。使用它的主要原因是:获取 API 密钥和身份验证、跟踪和处理的简单方法 "environments".
我的问题是,我们只想将所有查询参数 headers 等传递给我们的后端并让它处理。然后在返回的路上,我们希望将来自我们服务的适当响应代码传回给客户端;不必明确映射它们。据我了解,您几乎必须指定每个查询参数,如果参数发生变化或添加更多参数,则需要更新 api。在 dev/test.
期间,这对我们来说有点乏味
有没有办法告诉 Gateway 只接受并传递任何查询参数、headers 等,这样您就不必明确指定它们?响应状态代码的相同问题?
对于请求,有映射可以很容易地通过所有东西,这是我最近使用的一个:
{
"method": "$context.httpMethod",
"body" : $input.json('$'),
"headers": {
#foreach($param in $input.params().header.keySet())
"$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end
#end
},
"queryParams": {
#foreach($param in $input.params().querystring.keySet())
"$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end
#end
},
"pathParams": {
#foreach($param in $input.params().path.keySet())
"$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end
#end
},
"stage-variables" : {
#foreach($key in $stageVariables.keySet())
"$key" : "$util.escapeJavaScript($stageVariables.get($key))"
#if($foreach.hasNext),#end
#end
},
"context" : {
"account-id" : "$context.identity.accountId",
"api-id" : "$context.apiId",
"api-key" : "$context.identity.apiKey",
"authorizer-principal-id" : "$context.authorizer.principalId",
"caller" : "$context.identity.caller",
"cognito-authentication-provider" : "$context.identity.cognitoAuthenticationProvider",
"cognito-authentication-type" : "$context.identity.cognitoAuthenticationType",
"cognito-identity-id" : "$context.identity.cognitoIdentityId",
"cognito-identity-pool-id" : "$context.identity.cognitoIdentityPoolId",
"http-method" : "$context.httpMethod",
"stage" : "$context.stage",
"source-ip" : "$context.identity.sourceIp",
"user" : "$context.identity.user",
"user-agent" : "$context.identity.userAgent",
"user-arn" : "$context.identity.userArn",
"request-id" : "$context.requestId",
"resource-id" : "$context.resourceId",
"resource-path" : "$context.resourcePath"
}
}
它循环遍历所有 headers 和参数来映射所有内容。还有一个新功能 announced yesterday 允许您传递原始请求 body.
我认为您可以采用类似的方法来创建通用响应映射。您可能想查看 parseJson()
映射函数,它也是 announced yesterday。我相信新的 parseJson()
函数将允许您 return 包含来自后端的 JSON 数据的字符串,并且可以轻松地将其映射到 [=21= 中的 JSON 响应] 网关。
不幸的是,没有办法传递所有参数,您必须在方法请求中说明每个参数。状态代码的答案相同。
我们已经为 HTTP 端点和 Lambda 函数启动了 'proxy' 集成,它们将充当请求输入的代理并将所有参数和负载发送到集成。对于 Lambda 函数,有一个预构建的 JSON 结构,其中包含所有参数和有效负载,以及请求上下文和阶段变量。
这是我们过去收到的功能请求,它在我们的积压工作中,但目前没有 ETA。我将把它作为两个直通功能的另一个+1。
我相信您可以使用 API 网关的 http-proxy 功能 - 它会按照您发送给它的方式获取所有参数 - 到您提到的 EC2 URL 或任何其他 URL
我正在使用 API Amazon 中的网关作为后端 api 的简单代理。使用它的主要原因是:获取 API 密钥和身份验证、跟踪和处理的简单方法 "environments".
我的问题是,我们只想将所有查询参数 headers 等传递给我们的后端并让它处理。然后在返回的路上,我们希望将来自我们服务的适当响应代码传回给客户端;不必明确映射它们。据我了解,您几乎必须指定每个查询参数,如果参数发生变化或添加更多参数,则需要更新 api。在 dev/test.
期间,这对我们来说有点乏味有没有办法告诉 Gateway 只接受并传递任何查询参数、headers 等,这样您就不必明确指定它们?响应状态代码的相同问题?
对于请求,有映射可以很容易地通过所有东西,这是我最近使用的一个:
{
"method": "$context.httpMethod",
"body" : $input.json('$'),
"headers": {
#foreach($param in $input.params().header.keySet())
"$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end
#end
},
"queryParams": {
#foreach($param in $input.params().querystring.keySet())
"$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end
#end
},
"pathParams": {
#foreach($param in $input.params().path.keySet())
"$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end
#end
},
"stage-variables" : {
#foreach($key in $stageVariables.keySet())
"$key" : "$util.escapeJavaScript($stageVariables.get($key))"
#if($foreach.hasNext),#end
#end
},
"context" : {
"account-id" : "$context.identity.accountId",
"api-id" : "$context.apiId",
"api-key" : "$context.identity.apiKey",
"authorizer-principal-id" : "$context.authorizer.principalId",
"caller" : "$context.identity.caller",
"cognito-authentication-provider" : "$context.identity.cognitoAuthenticationProvider",
"cognito-authentication-type" : "$context.identity.cognitoAuthenticationType",
"cognito-identity-id" : "$context.identity.cognitoIdentityId",
"cognito-identity-pool-id" : "$context.identity.cognitoIdentityPoolId",
"http-method" : "$context.httpMethod",
"stage" : "$context.stage",
"source-ip" : "$context.identity.sourceIp",
"user" : "$context.identity.user",
"user-agent" : "$context.identity.userAgent",
"user-arn" : "$context.identity.userArn",
"request-id" : "$context.requestId",
"resource-id" : "$context.resourceId",
"resource-path" : "$context.resourcePath"
}
}
它循环遍历所有 headers 和参数来映射所有内容。还有一个新功能 announced yesterday 允许您传递原始请求 body.
我认为您可以采用类似的方法来创建通用响应映射。您可能想查看 parseJson()
映射函数,它也是 announced yesterday。我相信新的 parseJson()
函数将允许您 return 包含来自后端的 JSON 数据的字符串,并且可以轻松地将其映射到 [=21= 中的 JSON 响应] 网关。
不幸的是,没有办法传递所有参数,您必须在方法请求中说明每个参数。状态代码的答案相同。
我们已经为 HTTP 端点和 Lambda 函数启动了 'proxy' 集成,它们将充当请求输入的代理并将所有参数和负载发送到集成。对于 Lambda 函数,有一个预构建的 JSON 结构,其中包含所有参数和有效负载,以及请求上下文和阶段变量。
这是我们过去收到的功能请求,它在我们的积压工作中,但目前没有 ETA。我将把它作为两个直通功能的另一个+1。
我相信您可以使用 API 网关的 http-proxy 功能 - 它会按照您发送给它的方式获取所有参数 - 到您提到的 EC2 URL 或任何其他 URL