【问题标题】:Having issues with testing Lambda functions on AWS在 AWS 上测试 Lambda 函数时遇到问题
【发布时间】:2018-11-21 13:00:36
【问题描述】:

我一直在尝试通过 Amazon API Gateway 运行我在 Go 中的第一个 lambda 函数。

我在 go 中设置了以下包。目标是发送 JSON 请求并记录并返回该请求的正文:

package main

import (
    "net/http"
    "log"
    "github.com/aws/aws-lambda-go/lambda"
    "github.com/aws/aws-lambda-go/events"
)

func Handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {

    //These log statements return empty regardless of JSON input.
    log.Print(request.body)

    return events.APIGatewayProxyResponse{
        StatusCode: http.StatusOK,
        Body: request.Body
    }, nil
}

func main() {
    lambda.Start(Handler)
}

我可以构建和压缩它并将其上传到 AWS lambda 管理器。 AWS lambda 管理器包含一个使用测试事件的选项,我可以使用 JSON 字符串进行配置

{
  "testint": 1,
  "teststring": "test"
}

但是,如果我运行这个测试,我会得到以下结果:

{
  "statusCode": 200,
  "headers": null,
  "body": ""
}

我希望正文实际上包含我传递给函数的 json,但显然出了点问题。

【问题讨论】:

  • 首先,在您的日志记录中,您有一个错字:log.Print(request.body) 应该是 log.Print(request.Body)
  • 其次,lamda.Start不先发送上下文吗?
  • 例如,你的处理程序应该是:Handler(ctx context.Context, request events.APIGatewayProxyRequest)
  • @Derek 添加上下文似乎没有什么区别。它仍然返回一个空主体(即使大写正确)。亚马逊示例也没有列出上下文:aws.amazon.com/blogs/compute/…
  • 事实上,该网站上的示例甚至不适合我......它会返回错误“HTTP正文中没有提供名称”

标签: amazon-web-services go aws-lambda


【解决方案1】:

我改变了一些小东西,然后它就起作用了

首先,log.Print(request.body) 无法为我编译,但使用 request.Body 就可以了

其次,你用于请求的类型是

// APIGatewayProxyRequest contains data coming from the API Gateway proxy
type APIGatewayProxyRequest struct {
    Resource              string                        `json:"resource"` // The resource path defined in API Gateway
    Path                  string                        `json:"path"`     // The url path for the caller
    HTTPMethod            string                        `json:"httpMethod"`
    Headers               map[string]string             `json:"headers"`
    QueryStringParameters map[string]string             `json:"queryStringParameters"`
    PathParameters        map[string]string             `json:"pathParameters"`
    StageVariables        map[string]string             `json:"stageVariables"`
    RequestContext        APIGatewayProxyRequestContext `json:"requestContext"`
    Body                  string                        `json:"body"`
    IsBase64Encoded       bool                          `json:"isBase64Encoded,omitempty"`
}

在这个 Body 中有一个字段“body”,它是一个字符串。因此,将您的测试数据更改为

{
  "body": "HELLO"

}

会给出一些通过的数据

最后,所有示例中的 Handler 的参数似乎都包含一个上下文对象,所以我添加了它

func Handler(ctx context.Context, request events.APIGatewayProxyRequest) 

这是“为我工作”的程序的完整版本

package main

import (
    "context"
    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
    "log"
    "net/http"
)

func Handler(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {

    //These log statements return empty regardless of JSON input.
    log.Print(request.Body)

    return events.APIGatewayProxyResponse{
        StatusCode: http.StatusOK,
        Body:       request.Body}, nil
}

func main() {
    lambda.Start(Handler)
}

【讨论】:

  • 非常感谢;这应该提供足够的指针来继续!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
相关资源
最近更新 更多