dongliao1949 2018-06-12 07:49
浏览 139
已采纳

在AWS上测试Lambda函数时遇到问题

I have been trying to get my first lambda function in Go running via the Amazon API Gateway.

I have the following package set up in go. The goal is to send a JSON request and log and return the body of that request:

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)
}

I can build and zip this and upload it to the AWS lambda manager. The AWS lambda manager contains an option to use a test event which I can configure with a JSON string

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

However, if I run this test, I get the following result:

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

I would expect the body to actually contain the json I passed to the function, but clearly something is going wrong.

  • 写回答

1条回答 默认 最新

  • dongyuan1984 2018-06-20 19:23
    关注

    There's a few minor things I changed and then it works

    First, log.Print(request.body) doesn't compile for me, but using request.Body is fine

    Second, the type you are using for the request is

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

    and in this Body is a field "body" that's a string. So altering your test data to

    {
      "body": "HELLO"
    
    }
    

    will give some data that passes through

    Lastly, the parameters for the Handler in all the examples seems to include a context object, so I added that

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

    Here is a complete version of your program that "worked for me"

    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)
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 Android studio AVD启动不了
  • ¥15 陆空双模式无人机怎么做
  • ¥15 想咨询点问题,与算法转换,负荷预测,数字孪生有关
  • ¥15 C#中的编译平台的区别影响
  • ¥15 软件供应链安全是跟可靠性有关还是跟安全性有关?
  • ¥15 电脑蓝屏logfilessrtsrttrail问题
  • ¥20 关于wordpress建站遇到的问题!(语言-php)(相关搜索:云服务器)
  • ¥15 【求职】怎么找到一个周围人素质都很高不会欺负他人,并且未来月薪能够达到一万以上(技术岗)的工作?希望可以收到写有具体,可靠,已经实践过了的路径的回答?
  • ¥15 Java+vue部署版本反编译
  • ¥100 对反编译和ai熟悉的开发者。