代码之家  ›  专栏  ›  技术社区  ›  Bimde

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

  •  0
  • Bimde  · 技术社区  · 8 年前

    HTTP request body not getting to AWS lambda function via AWS API Gateway 或 Getting json body in aws Lambda via API gateway

    然而,这些问题都没有解决使用Golang的问题,我一直面临的问题是找到一个等价的 event

    这是我的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 字符串。

    请求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 回复  |  直到 7 年前
        1
  •  9
  •   Bimde    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

    推荐文章