4

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.

7
  • First, in your logging you have a typo: log.Print(request.body) should be log.Print(request.Body) Commented Jun 12, 2018 at 7:58
  • Secondly, doesn't lamda.Start send the context first? Commented Jun 12, 2018 at 8:00
  • For example, your handler should be: Handler(ctx context.Context, request events.APIGatewayProxyRequest) Commented Jun 12, 2018 at 8:01
  • @Derek adding the context doesn't seem to make a difference. It still returns an empty body (even capitalized correctly). The Amazon example also doesn't list the context: aws.amazon.com/blogs/compute/… Commented Jun 12, 2018 at 9:30
  • In fact, the example on that website does not even work for me...it will return the error "no name was provided in the HTTP body" Commented Jun 12, 2018 at 9:37

1 Answer 1

3

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)
}
Sign up to request clarification or add additional context in comments.

1 Comment

Thank you very much; this should give enough pointers to continue!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.