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

通过 API GW 调用时,AWS Lambda Go 函数未获取请求正文

通过 API GW 调用时,AWS Lambda Go 函数未获取请求正文

Go
慕仙森 2023-03-29 17:08:26
首先,有人可能会说这个问题与HTTP request body not getting to AWS lambda function via AWS API Gateway或Getting json body in aws Lambda via API gateway非常相似但是,这些问题都没有解决使用 Golang 的问题,我一直遇到的问题是找到event与 Node.js 文档中各处使用的参数等效的参数。这是我的 Lambda 函数:package mainimport (    "context"    "encoding/json"    "github.com/aws/aws-lambda-go/lambda"    "github.com/aws/aws-lambda-go/events"    "log")type MyReturn struct {    Response string `json:"response"`}type APIGWResponse struct {    IsBase64Encoded bool              `json:"isBase64Encoded"`    StatusCode      int               `json:"statusCode"`    Headers         map[string]string `json:"headers"`    Body            string            `json:"body"`}func handle(ctx context.Context, name MyReturn) (APIGWResponse, error) {    log.Print("Called by ", name)    log.Print("context ", ctx)    headers := map[string]string{"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Origin, X-Requested-With, Content-Type, Accept"}    code := 200    response, error := json.Marshal(myReturn{Response:"Hello, " + name.Body})    if error != nil {        log.Println(error)        response = []byte("Internal Server Error")        code = 500    }    return APIGWResponse{true, code, headers, string(response)}, nil}func main() {    lambda.Start(handle)}问题:MyReturn从 API GW 调用时,对象未填充任何值。该行log.Print("Called by ", name)不会将任何内容附加到字符串Called by。请求 API GW: POST -> body: '{"name":"Bob"}', headers: {'Content-Type': 'application/json'}这是在纯 JS 中执行的,如下所示:const BASE_URL = "https://my_api_id.execute-api.us-east-1.amazonaws.com/prod/";const TRIGGER_URL = "my_lambda_function";function toGW() {    fetch(BASE_URL + TRIGGER_URL, {        method: 'POST',        body: '{"name":"Bimesh"}',        headers:{            'Content-Type': 'application/json'        }    })    .then(data => data.json())    .then(json => console.log(json))    .catch(error => console.log(error));}然而,当从 AWS Lambda 控制台对其进行测试时,完全相同的主体仍然有效。身体:{"name":"Bob"}
查看完整描述

1 回答

?
海绵宝宝撒

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

事实证明,即使我无法在面向用户的网站上找到任何关于此的文档,文档也确实存在。阅读: https: //github.com/aws/aws-lambda-go/blob/master/events/README_ApiGatewayEvent.md


这是迄今为止我想出的从 API GW 接收数据和响应请求的最简单方法:


package main


import (

    "context"

    "encoding/json"

    "github.com/aws/aws-lambda-go/lambda"

    "github.com/aws/aws-lambda-go/events"

    "log"

)


type myReturn struct {

    Response string `json:"response"`

}


func handle(ctx context.Context, name events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {

    log.Print("Request body: ", name)

    log.Print("context ", ctx)

    headers := map[string]string{"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Origin, X-Requested-With, Content-Type, Accept"}


    code := 200

    response, error := json.Marshal(myReturn{Response:"Hello, " + name.Body})

    if error != nil {

        log.Println(error)

        response = []byte("Internal Server Error")

        code = 500

    }


    return events.APIGatewayProxyResponse {code, headers, string(response), false}, nil

}


func main() {

    lambda.Start(handle)

}

在这种情况下,该log.Print("Request body: ", name)行会记录准确的请求正文。问题解决了。


注意:我也不必APIGWResponse从问题中创建那个对象,这events.APIGatewayProxyResponse是完全一样的东西,已经为你做了。这些对象都在这个类里面: https: //github.com/aws/aws-lambda-go/blob/master/events/apigw.go


查看完整回答
反对 回复 2023-03-29
  • 1 回答
  • 0 关注
  • 70 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信