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

请求。通过 http 网关的正文具有与通过测试 GUI 不同的值

请求。通过 http 网关的正文具有与通过测试 GUI 不同的值

Go
MYYA 2022-09-19 21:13:26
我从 https://github.com/aws/aws-lambda-go/blob/master/events/README_ApiGatewayEvent.md 得到了这个代码:package mainimport (    "context"    "fmt"    "log"    "github.com/aws/aws-lambda-go/events"    "github.com/aws/aws-lambda-go/lambda")func handleRequest(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {    fmt.Printf("Processing request data for request %s.\n", request.RequestContext.RequestID)    fmt.Printf("Body size = %d.\n", len(request.Body))    fmt.Println("Headers:")    for key, value := range request.Headers {        fmt.Printf("    %s: %s\n", key, value)    }    log.Printf("%v", request.Body)    return events.APIGatewayProxyResponse{Body: request.Body, StatusCode: 200}, nil}func main() {    lambda.Start(handleRequest)}我只添加了:日志:日志。Printf(“%v”, request.正文)当我编译并使用 lambda 测试 GUI 时,我发送以下内容:{"body":"[{\"id\":\"123\"}]"}选项卡中的日志显示以下内容:2021/08/16 08:51:50 [{"id":"123"}]但是,当我这样做时:curl https://qmk743l1p0.execute-api.us-east-1.amazonaws.com/default/simplegateway -d '{"body":"[{\"id\":\"123\"}]"}' --header "Content-Type: application/json"我在云监视日志中得到这个:2021/08/16 08:56:07 {"body":"[{\"id\":\"123\"}]"} 我不知道为什么请求.body在通过http网关时会有两个不同的值。如何在 lambda 测试 GUI 中和通过 http API 网关获取预期的“正文”?
查看完整描述

1 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

发生这种情况是因为您的处理程序在这两种情况下具有相同的签名,但这意味着什么根据代理您的请求而有所不同。

当您从 Lambda GUI 发送请求时,正文会立即被解封到 中。该结构具有一个字段,该字段定义为:events.APIGatewayProxyRequest

Body string `json:"body"`

因此,当您发送有效负载 时,将使用 JSON 属性的值填充该字段,该属性为{"body":"[{\"id\":\"123\"}]"}json.Unmarshalbody[{"id":"123"}]

当通过 API 网关代理相同的请求时,网关会按原样构造一个包含您的有效负载的 AWS 事件,因此它可能如下所示:

{
    ...    "body": "{\"body\":\"[{\"id\":\"123\"}]\"}\"
}

只有这样,事件才会被解聚到结构中,导致字段具有值 。events.APIGatewayProxyRequestBody{"body":"[{\"id\":\"123\"}]"}


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

添加回答

举报

0/150
提交
取消
微信客服

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

帮助反馈 APP下载

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

公众号

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