логотип PurpleSchool
логотип PurpleSchool

API-сервер в Golang

Автор

Александр Гольцман

API-сервер в Golang

API-сервер — это ключевой компонент в разработке веб-приложений и микросервисов. Он обрабатывает запросы клиентов, взаимодействует с базами данных и отправляет ответы в формате JSON. В языке Go API-сервер можно построить с использованием стандартной библиотеки net/http или сторонних фреймворков.

В этой статье я покажу основные принципы работы API-сервера в Go: настройку маршрутов, обработку запросов и отправку JSON-ответов.

Основные концепции API-сервера

API-сервер строится вокруг трех ключевых элементов:

  • Маршруты (routes) – определяют, какие URL-адреса обрабатывает сервер и какие функции вызываются в ответ на запросы.
  • Обработчики (handlers) – функции, выполняющие логику обработки запросов (например, получение данных, их изменение или удаление).
  • Ответы (responses) – данные, которые сервер отправляет клиенту, чаще всего в формате JSON.

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

Запуск простого API-сервера

В стандартной библиотеке Go есть пакет net/http, который позволяет быстро поднять сервер:

package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Добро пожаловать в API!")
}

func main() {
    http.HandleFunc("/", handler) // Регистрация маршрута
    http.ListenAndServe(":8080", nil) // Запуск сервера на порту 8080
}

Этот сервер обрабатывает запросы на корневой маршрут / и возвращает простое текстовое сообщение.

Работа с HTTP-методами

API-сервер должен поддерживать несколько типов запросов:

  • GET – получение данных, например, списка пользователей.
  • POST – отправка данных на сервер (создание новой записи).
  • PUT/PATCH – обновление данных.
  • DELETE – удаление записей.

Пример обработки разных методов запроса:

func handler(w http.ResponseWriter, r *http.Request) {
    switch r.Method {
    case http.MethodGet:
        fmt.Fprintln(w, "Получен GET-запрос")
    case http.MethodPost:
        fmt.Fprintln(w, "Получен POST-запрос")
    default:
        http.Error(w, "Метод не поддерживается", http.StatusMethodNotAllowed)
    }
}

Смотрите, здесь мы добавили простую проверку метода запроса и отправляем разные ответы в зависимости от него.

Отправка JSON-ответов

В API-сервере данные обычно передаются в формате JSON. Golang имеет встроенные инструменты для работы с JSON, включая пакет encoding/json.

Вот пример обработки запроса и возврата JSON-ответа:

import (
    "encoding/json"
    "net/http"
)

type Response struct {
    Message string `json:"message"`
}

func jsonHandler(w http.ResponseWriter, r *http.Request) {
    response := Response{Message: "Привет, это JSON-ответ"}
    json.NewEncoder(w).Encode(response)
}

Этот обработчик создаёт структуру Response и отправляет её клиенту в формате JSON.

Маршрутизация с gorilla/mux

Хотя net/http позволяет регистрировать маршруты, в сложных API удобнее использовать сторонние библиотеки. Одна из самых популярных — gorilla/mux.

import (
    "github.com/gorilla/mux"
)

router := mux.NewRouter()
router.HandleFunc("/api", handler).Methods("GET", "POST")

Здесь маршрутизатор позволяет удобно управлять разными HTTP-методами.

Заключение

В этой статье я показал, как устроен API-сервер в Go, начиная от простого HTTP-сервера до обработки JSON и маршрутизации. Golang предлагает встроенные инструменты для работы с HTTP, но для удобства можно использовать gorilla/mux, Gin или Fiber.

Если вам нужен быстрый и минималистичный сервер, можно использовать стандартную библиотеку. Если API-сервер должен быть гибким и масштабируемым, стоит обратить внимание на фреймворки, которые добавляют удобные инструменты для работы с запросами, логированием и middleware.

Стрелочка влевоПаттерн Builder в Golang

Все гайды по Golang

Работа с YAML в GolangПреобразование типов в GolangКонвертация структур в JSON в GolangStrconv в GolangИспользование пакета SQLx для работы с базами данных в GolangРазбираемся с SQL в GolangРазделение строк с помощью функции split в GolangSort в GoПоиск и замена строк в Go - GolangИспользование пакета reflect в GolangРабота с PostgreSQL в GoPointers в GolangПарсинг в GoРабота со списками (list) в GolangПреобразование int в string в GolangРабота с числами с плавающей точкой в GolangРабота с полями в GolangИспользование enum в GolangОбработка JSON в GoЧтение и запись CSV-файлов в GolangРабота с cookie в GolangРегистры в GoКэширование данных в GolangПреобразование byte в string в GolangByte в GoИспользование bufio для работы с потоками данных в GolangДобавление данных и элементов (add) в Go
Логирование в Golang. Zap, Logrus, Loki, GrafanaРабота с Docker-контейнерами в GoИспользование pprof в GolangМеханизмы синхронизации в GolangРабота с пакетом S3 в GolangМониторинг Golang приложений с помощью PrometheusОптимизация проектов на GoПаттерны проектирования в GolangМиграции базы данных в GolangОркестрация контейнеров Go с Kubernetes + DockerGjGo Playground и компилятор GolangИспользование go mod init для создания модулей GolangРабота с переменными окружения (env) в GolangКоманда go build в GolangАвтоматизация Golang проектов — CI/CD с GitLab CI и JenkinsОтладка кода в GolangЧтение и использование конфигурации в приложениях на GolangКомпиляция в GolangКак развернуть Go-приложение на облаке AWSАутентификация в Golang
Сетевые протоколы в GoПеременные в GolangЗначения в GolangДженерик %T и его применение в GolangТипы данных в GolangИспользование tls в GolangИспользование tag в структурах GolangSwitch в GoСтроки в GolangРабота с потоками (stream) в GolangSelect в GoРуны в GoРабота с пакетом params в GolangКонвертация строк в числа в GolangNull, Nil, None, 0 в GoНаименования переменных, функций и структур в GoInt в GolangУстановка GolangЧтение и установка HTTP заголовков в GolangMethods в GolangGoLand — IDE для разработки на Golang от JetBrainsОбработка «not found» в GolangFloat в GolangФлаги командной строки в Go (Golang)Запуск внешних команд в GolangОбработка ошибок в GoИспользование defer в GolangЗначения default в GolangГенерация кода в GoФорматирование кода в GolangЧистая архитектура в GolangКаналы (channels) в GolangПолучение body из HTTP запроса в Golang
Открыть базу знаний