首页 文章

AWS API Gateway:传递所有参数

提问于
浏览
15

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

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

有没有办法告诉Gateway只接受并传递任何查询参数, Headers 等,这样你就不必明确指定它们?响应状态代码的相同问题?

3 回答

  • 6

    遗憾的是,没有办法对所有参数进行直通,您必须在方法请求中声明每个参数 . 状态代码的答案相同 .

    我们已经为HTTP endpoints 和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

    这是我们过去的功能请求,它位于我们的待办事项上,但此时没有ETA . 我将把它作为两个直通功能的另一个 .

  • 1

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

    {
      "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允许您传递原始请求正文 .

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

  • 12

    我相信你可以使用API网关的http-proxy功能 - 它将把你发送给它的所有参数 - 带到你提到的EC2 URL或任何其他URL

相关问题