【问题标题】:python pass querystring parameters to API gatewaypython将查询字符串参数传递给API网关
【发布时间】:2018-04-18 11:24:03
【问题描述】:

我正在尝试将 API 网关与 Lambda 代理集成,

API 服务器接收带有这些参数的请求,即邮政编码和房屋

https://api.domain.com/getAddressproxy?postcode=XX2YZ&house=123

但是从 API 网关到 Lambda 代理的测试不返回值

https://xxxxxxxxxx.execute-api.eu-west-1.amazonaws.com/Test/getaddressproxy?postcode=XX2YZ&house=123

我认为问题在于 lambda 函数没有将查询字符串参数传递给 API 服务器。

知道如何将查询字符串参数传递给请求对象吗?

代码:

from __future__ import print_function

import json
import urllib2
import ssl

print('Loading function')

target_server = "https://api.domain.com"

def lambda_handler(event, context):
    print("Got event\n" + json.dumps(event, indent=2))

    ctx = ssl.create_default_context()
    ctx.check_hostname = False
    ctx.verify_mode = ssl.CERT_NONE

    print("Event here: ")
    print(event['path'])
    print(event["queryStringParameters"])

    req = urllib2.Request(target_server + event['path'])

    if event['body']:
        req.add_data(event['body'])

    # Copy only some headers
    copy_headers = ('Accept', 'Content-Type')

    for h in copy_headers:
        if h in event['headers']:
            req.add_header(h, event['headers'][h])

    out = {}

    try:
        resp = urllib2.urlopen(req, context=ctx)
        out['statusCode'] = resp.getcode()
        out['body'] = resp.read()

    except urllib2.HTTPError as e:

        out['statusCode'] = e.getcode()
        out['body'] = e.read()

    return out

【问题讨论】:

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


    【解决方案1】:

    event["queryStringParameters"] 是一个字典,如果 API 网关通过一个或None 如果没有通过。将其转换为查询字符串并附加到请求 URL。

    ...
    import urllib
    ...
    
    qs = urllib.urlencode(event["queryStringParameters"] or {})
    req = urllib2.Request(
            ''.join(
              (target_server, event['path'], '?', qs)
            )
          )
    

    【讨论】:

      【解决方案2】:

      您可以像下面那样在 Lambda 中获取查询字符串,

      var result =  event["queryStringParameters"]['queryStringParam1']
      

      根据您的 API URL,

      var postcode =  event["queryStringParameters"]['postcode']
      var house =  event["queryStringParameters"]['house']
      

      或者您可以在集成请求部分使用正文映射模板并获取请求正文和查询字符串。在正文映射模板处构造一个新的 JSON,其中将包含来自请求正文和查询字符串的数据。当我们添加身体映射模板时,您的业务逻辑将获得我们在身体映射模板中构建的 JSON。

      请在正文映射模板中获取查询字符串,

      $input.params('querystringkey')

      例如体内映射模板,

      #set($inputRoot = $input.path('$'))
      {
      "firstName" : "$input.path('$.firstName')",
      "lastName" : "$input.path('$.lastName')"
      "language" : "$input.params('$.language')"
      }

      请阅读https://aws.amazon.com/blogs/compute/tag/mapping-templates/了解更多关于身体映射模板的详细信息

      【讨论】:

      • 我在 API 网关中使用 Lambda 集成,所以我没有创建身体映射模板的选项,还有其他想法吗?
      • @krisdigitx 身体映射模板你只能做 API 网关。请查看我分享的网址
      • 您也可以直接从代码中获取。我已经更新了答案
      猜你喜欢
      • 2020-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      • 1970-01-01
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多