为了账号安全,请及时绑定邮箱和手机立即绑定

无法从 Amazon API Gateway for Golang 将参数从 POST

无法从 Amazon API Gateway for Golang 将参数从 POST

Go
牛魔王的故事 2022-04-20 19:31:06
它不同于 -如何将参数从 POST 传递到来自 Amazon API Gateway 的 AWS Lambda。因为我能够转换 API Gateway 中的参数,但不能传递它或用 Golang 打印它。但是,相同的 API 网关适用于 Python。下面是我的 API Gateway 和 AWS Lambda(Golang) 的日志。我可以看到 POST 参数已成功转换为 JSON。不过,我在 Lambda 函数日志中看不到它。API 网关日志(442f74ed-39e5-4372-bf85-42bf814f802f) Extended Request Id: EIaYxxMF3lQ=(442f74ed-39e5-4372-bf85-42bf814f802f) Method request path: {}(442f74ed-39e5-4372-bf85-42bf814f802f) Method request query string:    {}(442f74ed-39e5-4372-bf85-42bf814f802f) Method request headers: {Accept=*/*, Cache-Control=max-age=259200, X-Twilio-Signature=ZWg2v7xxxfnBlPyxE=, User-Agent=TwilioProxy/1.1, X-Forwarded-Proto=https, I-Twilio-Idempotency-Token=e5d1xxx221bc4, X-Forwarded-For=54.xxxx.227, Host=xxxxxxx.execute-api.us-east-1.amazonaws.com, X-Forwarded-Port=443, X-Amzn-Trace-Id=Root=1-5de67103-7994dbxxx0dbd872, Content-Type=application/x-www-form-urlencoded}}  (442f74ed-39e5-4372-bf85-42bf814f802f) Endpoint request URI: https://lambda.us-east-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-east-1:6xxxxxxxx6:function:Twillio_connector_test/invocations(442f74ed-39e5-4372-bf85-42bf814f802f) Endpoint request body after transformations:     {        "ToCountry": "US",        "ToState": "UT",        "SmsMessageSid": "SMed65aaxxxxxx5c7938df",        "NumMedia": "0",        "ToCity": "",        "FromZip": "",        "SmsSid": "SMed65aaxxxxxx938df",        "FromState": "",        "SmsStatus": "received",        "FromCity": "",        "Body": "Testing+again",        "FromCountry": "IN",        "To": "%2B1xxxxxx848",        "ToZip": "",        "NumSegments": "1",        "MessageSid": "SMed65aa5dxxxx7938df",        "AccountSid": "AC23xxxd98",        "From": "%2B9xxxxxx90",        "ApiVersion": "2010-04-01"    }我尝试了很多方法。但是我无法在 Golang 代码中获取所需的参数。如果我做错了什么,请纠正我。任何帮助将不胜感激。
查看完整描述

1 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

结论 :

这个问题是由 golang 和 python 中 lambda handler 的 param struct 不同引起的。


细节:

API Gateway 映射模板制作的 JSON:

    {

        "ToCountry": "US",

        "ToState": "UT",

        "SmsMessageSid": "SMed65aaxxxxxx5c7938df",

        "NumMedia": "0",

        "ToCity": "",

        "FromZip": "",

        "SmsSid": "SMed65aaxxxxxx938df",

        "FromState": "",

        "SmsStatus": "received",

        "FromCity": "",

        "Body": "Testing+again",

        "FromCountry": "IN",

        "To": "%2B1xxxxxx848",

        "ToZip": "",

        "NumSegments": "1",

        "MessageSid": "SMed65aa5dxxxx7938df",

        "AccountSid": "AC23xxxd98",

        "From": "%2B9xxxxxx90",

        "ApiVersion": "2010-04-01"

    }

eventpython中的参数:

    def lambda_handler(event, context):

        print("Received event: " + str(event))

        return '<?xml version=\"1.0\" encoding=\"UTF-8\"?>'\

           '<Response><Message>Hello world! -Lambda</Message></Response>'

参考AWS Python 文档:


事件 – AWS Lambda 使用此参数将事件数据传递给处理程序。该参数通常是 Python dict 类型。它也可以是列表、str、int、float 或 NoneType 类型。


【重要部分】events.APIGatewayProxyRequest golang中的参数:

// APIGatewayProxyRequest contains data coming from the API Gateway proxy

type APIGatewayProxyRequest struct {

    Resource                        string                        `json:"resource"` // The resource path defined in API Gateway

    Path                            string                        `json:"path"`     // The url path for the caller

    HTTPMethod                      string                        `json:"httpMethod"`

    Headers                         map[string]string             `json:"headers"`

    MultiValueHeaders               map[string][]string           `json:"multiValueHeaders"`

    QueryStringParameters           map[string]string             `json:"queryStringParameters"`

    MultiValueQueryStringParameters map[string][]string           `json:"multiValueQueryStringParameters"`

    PathParameters                  map[string]string             `json:"pathParameters"`

    StageVariables                  map[string]string             `json:"stageVariables"`

    RequestContext                  APIGatewayProxyRequestContext `json:"requestContext"`

    Body                            string                        `json:"body"`

    IsBase64Encoded                 bool                          `json:"isBase64Encoded,omitempty"`

}

所以你可以看到,你提供给 Golang AWS lambda handler 的 json map 只匹配一个 key Body。这就是 printf 只打印Testing Again.


解决方案:

要使用 golang 编写的 lambda 获得正确的结果,我认为您可以参考AWS DOC 的这一部分。(这对我们了解 AWS API Gateway 映射模板的工作原理很有帮助。)


重写映射模板以匹配APIGatewayProxyRequestJSON 标记。


查看完整回答
反对 回复 2022-04-20
  • 1 回答
  • 0 关注
  • 221 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号