Python如何将查询字符串参数传递给API网关

7

我正在尝试将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
2个回答

8

您可以在Lambda内使用以下方式获取查询字符串:

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

根据您的API URL,
var postcode =  event["queryStringParameters"]['postcode']
var house =  event["queryStringParameters"]['house']

你可以在集成请求部分使用body mapping模板来获取请求正文和查询字符串。在body mapping模板中构建一个新的JSON,其中包含来自请求正文和查询字符串的数据。由于我们正在添加body mapping模板,因此您的业务逻辑将获得我们在body mapping模板中构建的JSON。

在body mapping模板内获取查询字符串,请执行以下操作:

$input.params('querystringkey')

例如,在body mapping模板内:

#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集成,因此我没有创建body映射模板的选项,还有其他想法吗? - krisdigitx
1
@krisdigitx,身体映射模板只能在API网关上完成。请查看我分享的URL。 - Vijayanath Viswanathan
或者你可以直接从代码中获取。我已经更新了答案。 - Vijayanath Viswanathan

6

event["queryStringParameters"]是一个字典,如果API Gateway传递了一个字典,则为该字典;如果没有传递,则为None。将其转换为查询字符串并附加到请求URL中。

...
import urllib
...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接