我从 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/