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

2024-03-18

首先,有人可能会说这个问题非常类似于HTTP 请求正文无法通过 AWS API Gateway 访问 AWS lambda 函数 https://stackoverflow.com/questions/41059440/http-request-body-not-getting-to-aws-lambda-function-via-aws-api-gateway or 通过API网关在aws Lambda中获取json正文 https://stackoverflow.com/questions/41648467/getting-json-body-in-aws-lambda-via-api-gateway

然而,这些问题都没有涉及使用 Golang,而且我一直遇到的问题是找到与eventNode.js 文档中随处使用的参数。

这是我的 Lambda 函数:

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"`
}

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 string.

向 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 控制台测试时,完全相同的主体可以工作。

Body:

{"name":"Bob"}

事实证明,尽管我无法在面向用户的网站上找到任何相关文档,但文档确实存在。读这个:https://github.com/aws/aws-lambda-go/blob/master/events/README_ApiGatewayEvent.md 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 https://github.com/aws/aws-lambda-go/blob/master/events/apigw.go

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐