Amazon web services AWS API网关:通过所有参数

Amazon web services AWS API网关:通过所有参数,amazon-web-services,aws-api-gateway,Amazon Web Services,Aws Api Gateway,我在Amazon中使用API网关作为后端API的简单代理。使用它的主要原因是:获取API密钥和身份验证、跟踪和处理“环境”的简单方法 我的问题是,我们只想将所有查询参数、头等传递到后端,让它处理它。然后在返回的过程中,我们希望将服务中的相应响应代码传递回客户机;不必显式地映射它们。据我所知,您几乎必须指定每个查询参数,如果参数更改或添加更多,则需要更新api。在开发/测试期间,这对我们来说有点乏味 有没有一种方法可以告诉Gateway只接受并传递任何查询参数、标题等,这样您就不必显式地指定它们?

我在Amazon中使用API网关作为后端API的简单代理。使用它的主要原因是:获取API密钥和身份验证、跟踪和处理“环境”的简单方法

我的问题是,我们只想将所有查询参数、头等传递到后端,让它处理它。然后在返回的过程中,我们希望将服务中的相应响应代码传递回客户机;不必显式地映射它们。据我所知,您几乎必须指定每个查询参数,如果参数更改或添加更多,则需要更新api。在开发/测试期间,这对我们来说有点乏味


有没有一种方法可以告诉Gateway只接受并传递任何查询参数、标题等,这样您就不必显式地指定它们?对于响应状态代码也是一样的问题?

对于请求,有一些映射可以轻松地传递所有内容,这是我最近使用的一个映射:

{
  "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"
  }
}
它循环遍历所有标题和参数以映射所有内容。还有一个新特性允许您传递原始请求正文

我认为您可以采用类似的方法来创建通用响应映射。您可能想看看
parseJson()
mapping函数,该函数也是。我相信新的
parseJson()
函数将允许您从后端返回包含JSON数据的字符串,并将其轻松映射到API网关中的JSON响应。

不幸的是,没有办法传递所有参数,您必须在方法请求中声明每个参数。状态代码的答案相同

此后,我们启动了HTTP端点和Lambda函数的“代理”集成,该集成将充当请求输入的代理,并将所有参数和有效负载发送到集成。对于Lambda函数,有一个预构建的JSON结构,其中包含所有参数和负载,以及请求上下文和阶段变量

见本文件:


这是我们过去收到的一个功能请求,它在我们的待办事项中,但目前没有ETA。对于这两个直通特性,我将把它作为另一个+1

我相信您可以使用API Gateway的http代理功能-它将以您发送给它的方式接收所有参数-到您提到的EC2 URL或任何其他URL

@jack kohn aws我需要通过过滤器查询参数。e、 g.我将如何实现这一目标?+1。这对那些试图迁移遗留API的人来说是一个很大的帮助,这些API中包含了大量的特殊端点,几乎没有查询参数的文档。我认为这已经是可能的:-)它说你可以使用贪婪的路径变量(如
{proxy+}
)捕获所有路径参数。是否也可以指定例如
{proxy*}
以允许
路径参数
为空?这将转到何处?这是兰姆达还是别的什么地方?从外表上看,这不是自大。您能为您的答案添加更多的上下文吗?@EdgeCaseBerg这是一个AWS API网关请求映射模板。此处记录: