amazon-web-services - request.Body 通过 http 网关的值与通过测试 GUI 的值不同

标签 amazon-web-services go aws-lambda

我从 https://github.com/aws/aws-lambda-go/blob/master/events/README_ApiGatewayEvent.md 获得此代码:

package main

import (
    "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)
}

我只添加了:日志:log.Printf("%v", request.Body)

当我编译并使用 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"

我在 CloudWatch 日志中得到此信息:

2021/08/16 08:56:07 {"body":"[{\"id\":\"123\"}]"} 

我不知道为什么 request.body 在通过 http 网关时会有两个不同的值。

如何在 lambda 测试 GUI 和 http API 网关中获取预期的“主体”?

最佳答案

发生这种情况是因为您的处理程序在两种情况下都具有相同的签名,但这意味着什么取决于代理您的请求的内容。

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

Body string `json:"body"`

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

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

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

只有这样,事件才会被解码到 events.APIGatewayProxyRequest 结构中,导致 Body 字段的值为 {"body":"[{\"id\":\"123\"}]"}

关于amazon-web-services - request.Body 通过 http 网关的值与通过测试 GUI 的值不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68800162/

相关文章:

java - 仅列出 s3 存储桶中的子文件夹

ios - 是否可以将 Socket.io 与 AWS Lambda 一起使用?

google-app-engine - 将简单的 golang 应用程序部署到 appengine 已停止工作

Golang 从串行读取

python - 使用 SQLAlchemy 时 SAM 构建失败

api - 如何在 Lambda 函数中监控用户特定的事件或指标?

amazon-web-services - AWS Codebuild git webhook 中的 HEAD_REF 与 BASE_REF 有什么区别?

java - Android 应用程序的后端建议

mongodb - 用于插入或获取 mongo-driver 文档的自定义编码器/解码器

aws-lambda - 使用 Lambda 启动和拆除集群