【问题标题】:AWS API Gateway: Pass through all parametersAWS API Gateway:传递所有参数
【发布时间】:2016-07-28 20:05:27
【问题描述】:

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

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

有没有办法告诉网关只接受并传递任何查询参数、标头等,这样您就不必明确指定它们?响应状态码也有同样的问题?

【问题讨论】:

    标签: amazon-web-services aws-api-gateway


    【解决方案1】:

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

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

    查看此文档:http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-set-up-lambda-proxy-integration-on-proxy-resource

    这是我们过去提出的一项功能请求,它在我们的积压工作中,但目前没有预计到达时间。我会将此作为两个直通功能的另一个 +1。

    【讨论】:

    • @jack-kohn-aws 我需要通过过滤器查询参数。例如api.xxx/pets?filters[search]=cute我将如何实现这一目标?
    • +1。这对于尝试迁移充满临时端点且查询参数文档很少的旧 API 的人们将有很大帮助。
    • 我认为这已经成为可能 :-) aws.amazon.com/about-aws/whats-new/2016/09/…
    • 它说你可以使用像{proxy+}这样的贪婪路径变量来捕获所有路径参数。是否也可以指定例如{proxy*} 允许pathParameters 为空?
    【解决方案2】:

    对于请求,有映射可以轻松通过一切,这是我最近使用的一个:

    {
      "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"
      }
    }
    

    它遍历所有标题和参数以映射所有内容。还有一个新功能是 announced yesterday,它允许您传递原始请求正文。

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

    【讨论】:

    • 这个去哪儿了?这是 lambda 中的东西还是其他地方?从它的外观来看,它并不招摇。您可以在答案中添加更多上下文吗?
    • @EdgeCaseBerg 这是一个 AWS API Gateway 请求映射模板。记录在这里:docs.aws.amazon.com/apigateway/latest/developerguide/…
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 2015-11-10
      • 2016-11-18
      • 2021-01-13
      • 2017-11-14
      • 1970-01-01
      相关资源
      最近更新 更多