Возникли проблемы с тестированием функций Lambda на AWS - PullRequest
0 голосов
/ 12 июня 2018

Я пытался запустить свою первую лямбда-функцию в Go через Amazon API Gateway.

У меня установлен следующий пакет в 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.Лямбда-менеджер AWS содержит опцию для использования тестового события, которое я могу настроить с помощью строки JSON

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

Однако, если я запускаю этот тест, я получаю следующий результат:

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

Я ожидал бы, что тело на самом деле будет содержать json, который я передал функции, но явно что-то идет не так.

1 Ответ

0 голосов
/ 20 июня 2018

Есть несколько незначительных вещей, которые я изменил, и затем это работает

Во-первых, 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": "HELLO"

}

даст некоторые данные, которые проходят через

Наконец, параметры для обработчика во всех примерах, кажется, включают объект контекста, поэтому я добавил, что

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