[英]curl request to AWS lambda function receives no json
我有直接從 lambda 教程的 go 部分復制的代碼
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"github.com/aws/aws-lambda-go/lambda"
)
type MyEvent struct {
Name string `json:"name"`
Age int `json:"age"`
}
type MyResponse struct {
Message string `json:"Answer"`
}
func HandleLambdaEvent(ctx context.Context, event MyEvent) (MyResponse, error) {
// event
eventJson, _ := json.MarshalIndent(event, "", " ")
log.Printf("EVENT: %s", eventJson)
return MyResponse{Message: fmt.Sprintf("%s is %d years old!", event.Name, event.Age)}, nil
}
func main() {
lambda.Start(HandleLambdaEvent)
}
我創建了一個 .zip 文件、一個角色、附加了該角色並在 lambda 上創建了函數。
我可以成功調用 aws lambda 函數
# aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{"name": "Kevin", "age":62}' output.txt
# cat output.txt
{"Answer":"Kevin is 62 years old!"}
我創建了一個函數 URL 並可以通過 awscurl(或 curl)調用它
# curl -X POST https://XXXXXXXXXX.lambda-url.us-east-1.on.aws/ \
-H 'Content-type: application/json' \
--user AWS_ID:AWS_KEY \
--aws-sigv4 "aws:amz:us-east-1:lambda \
-d '{"Name": "Kevin", "Age": 62}'
但是 json 不會轉到函數(從日志中驗證),因此不會被我的函數處理
{"Answer":" is 0 years old!"}
我對lambda:InvokeFunctionURL
,但這沒有任何區別
更新:我HandleLambdaRequest
函數做了很多改動,見下文
func HandleLambdaEvent(ctx context.Context, request map[string]interface{}) (MyResponse, error) {
// event
jsonStr, err := json.Marshal(request)
if err != nil {
return MyResponse{Message: "can't unmarshal request"}, nil
}
var event Event
if err = json.Unmarshal(jsonStr, &event); err != nil {
return MyResponse{Message: err.Error()}, nil
}
if event.Name == "" {
var apigate events.APIGatewayV2HTTPRequest
if err = json.Unmarshal(jsonStr, &apigate); err != nil {
return MyResponse{Message: "can't get event or request"}, nil
}
body := []byte(apigate.Body)
if err = json.Unmarshal(body, &event); err != nil {
return MyResponse{Message: "can't unmarshal api.Body"}, nil
}
return MyResponse{Message: fmt.Sprintf("url %s:%d", event.Name, event.Age)}, nil
}
return MyResponse{Message: fmt.Sprintf("invoke %s:%d", event.Name, event.Age)}, nil
}
當您通過函數 URL 調用函數時,Lambda 會以不同方式處理您的請求,這不是很直觀,特別是對於不熟悉 Amazon API Gateway 服務中的 lambda 集成的人來說。 我希望他們在文檔中更清楚地說明這一點。 這是請求和響應有效負載結構。 在您的情況下,POST 有效負載映射到event.Body
,您需要像這樣在“MyEvent”結構中定義“body”,
type MyEvent struct {
...
Body string `json:body`
}
希望這可以幫助。
MyEvent
與您的 Lambda 實際接收的負載不匹配。 當通過函數 URL 調用時,您的 Lambda 會收到一個具有API 網關請求形狀的事件。
github.com/aws/aws-lambda-go包包含各種 Lambda 調用事件的請求和響應類型。 APIGatewayV2HTTPRequest是您正在尋找的那個。 您的 POST 負載在Body
中。
type APIGatewayV2HTTPRequest struct {
Version string `json:"version"`
RouteKey string `json:"routeKey"`
RawPath string `json:"rawPath"`
RawQueryString string `json:"rawQueryString"`
Cookies []string `json:"cookies,omitempty"`
Headers map[string]string `json:"headers"`
QueryStringParameters map[string]string `json:"queryStringParameters,omitempty"`
PathParameters map[string]string `json:"pathParameters,omitempty"`
RequestContext APIGatewayV2HTTPRequestContext `json:"requestContext"`
StageVariables map[string]string `json:"stageVariables,omitempty"`
Body string `json:"body,omitempty"`
IsBase64Encoded bool `json:"isBase64Encoded"`
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.