Во-первых, можно было бы сказать, что этот вопрос очень похож на Тело HTTP-запроса, не доходящее до лямбда-функции AWS через AWS API Gateway или Получение тела json в AWS Lambda через шлюз API
Однако ни один из этих вопросов не касается использования Golang, и проблема, с которой я столкнулся, заключается в нахождении эквивалента параметра event
, используемого повсеместно в документации по Node.js.
Вот моя лямбда-функция:
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"}