Перейти к основному содержимому

Работа с телом запроса

Это пример покажет как разобрать тело запроса в функции на Go и вернуть ответ.

package main

import (
"context"
"encoding/json"
"fmt"
)

// Request input JSON document will be automatically converted to the object of this type
type Request struct {
Message string `json:"message"`
Number int `json:"number"`
}

type ResponseBody struct {
Request interface{} `sjson:"request"`
}

func Handler(ctx context.Context, request *Request) ([]byte, error) {
// In function logs, the values of the call context and the request body will be printed
fmt.Println("context", ctx)
fmt.Println("request", request)

// The object containing the response body is converted to an array of bytes
body, err := json.Marshal(&ResponseBody{
Request: request,
})

if err != nil {
return nil, err
}

// The response body must be returned as an array of bytes
return body, nil
}

Развертывание

Для развертывания этой функции в Yandex Cloud вы можете воспользоваться Terraform описанным в примере.

Для этого мы сначала определяем ресурс archive_file для создания zip-архива с функцией.

resource "archive_file" "function_files" {
output_path = "./function.zip"
source_dir = "../function"
type = "zip"
}

А затем ресурс yandex_function для создания функции в Yandex Cloud, куда передаем zip-архив с функцией.

resource "yandex_function" "raw-request-function" {
name = "raw-request-function"
user_hash = archive_file.function_files.output_sha256
runtime = "golang121"
entrypoint = "index.Handler"
memory = "128"
execution_timeout = "10"
content {
zip_filename = archive_file.function_files.output_path
}
}

И в конце, если мы хотим сделать функцию доступной из интернета, мы можем создать ресурс yandex_function_iam_binding что бы разрешить доступ к функции всем пользователям, тем самым сделав ее публичной.

resource "yandex_function_iam_binding" "test_function_binding" {
function_id = yandex_function.raw-request-function.id
role = "functions.functionInvoker"
members = ["system:allUsers"]
}

Запуск

Теперь, когда функция развернута, мы можем вызвать ее с помощью curl:

curl -XPOST \
"https://functions.yandexcloud.net/$FUNCTION_ID?integration=raw" \
-d '{"message": "Hello, world", "number": 24}' \
-H "Content-Type: application/json"

В ответ мы получим JSON:

{"request":{"message":"Hello, world","number":24}}