Создание простого API в Go с помощью Fiber, GORM, Postgres и Docker
Cегодня мы создадим простой API в Go с помощью Fiber, Postgres и GORM. Мы используем Docker, поэтому вам не придется устанавливать Postgres на локальной машине.
Прежде чем мы начнем, вот репозиторий с кодом (https://github.com/hellokvn/go-fiber-api-docker) на Github.
Необходимые условия
Вам необходимо иметь установленный Docker на вашей локальной машине. Также необходимо иметь базовое понимание Go.
Контейнер docker будет использовать Go версии 1.18 и Postgres версии 14.2.
Настройка проекта
Прежде всего, мы собираемся инициировать наш проект и установить необходимые нам модули.
$ mkdir go-fiber-api-docker
$ cd go-fiber-api-docker
$ go mod init go-fiber-api-docker
Теперь давайте установим Fiber, GORM и Viper. Мы используем Viper для управления переменными окружения, которые мы собираемся установить в .env файл позже.
$ go get github.com/spf13/viper
$ go get github.com/gofiber/fiber/v2
$ go get gorm.io/gorm
$ go get gorm.io/driver/postgres
Продолжим работу над окончательной структурой проекта.
$ mkdir -p cmd pkg/products pkg/common/db pkg/common/config pkg/common/models
Дополнительно добавим несколько файлов.
$ touch Makefile .env docker-compose.yml Dockerfile cmd/main.go pkg/products/add_product.go
pkg/products/controller.go pkg/products/delete_product.go pkg/products/get_product.go pkg/products/get_products.go pkg/products/update_product.go pkg/common/db/db.go pkg/common/config/config.go pkg/common/models/product.go
Итак, после создания нашего проекта структура файлов должна выглядеть следующим образом:
Во-первых, нам нужно добавить некоторые переменные окружения, в которых мы будем хранить порт приложения, который мы будем прослушивать, и URL к базе данных.
Давайте добавим код в .env
PORT=:3000
DB_HOST=postgres
DB_PORT=5432
DB_USER=user
DB_PASS=password
DB_NAME=products_api
https://gist.githubusercontent.com/hellokvn/8e0f16bc2c042875d7e0e65004360337/raw/9eef80f4deaf372436779d87a665b4c802cccfe8/.env
В этом файле мы определяем структуру Config, чтобы разгруппировать ранее определенные переменные окружения.
Добавим код в pkg/common/config/config.go
Модель
У нас будет только одна модель/сущность, которая называется Product.
Добавим код в pkg/common/models/product.go
Подключение к базе данных
Здесь мы подключаемся к базе данных, которую мы установили с помощью Docker. Функция AutoMigrate автоматически генерирует таблицу product.
Добавим код в pkg/common/db/db.go
В этом файле мы определяем структуру Config, чтобы разгруппировать ранее определенные переменные окружения.
Добавим код в pkg/common/config/config.go
Контроллер
Здесь мы определяем struct, чтобы указать на него приемнику DB.
Добавим код в pkg/products/controller.go
Добавить продукт
Это первый обработчик, который создает новый продукт на основе тела запроса.
Добавим код в файл pkg/products/add_product.go
Удалить продукт
Этот обработчик удалит продукт по параметру id.
Добавим код в pkg/products/delete_product.go
Получить продукт по идентификатору
Здесь мы снова получаем id из параметра, чтобы найти конкретный продукт.
Добавим код в pkg/products/get_product.go
Получить все продукты
В этой части мы получаем все продукты .
Обновить продукт
Для того чтобы обновить продукт, нам нужно сначала найти продукт по его id, затем мы объединим новую полезную нагрузку с продуктом, прежде чем сохранить его.
Добавим код в файл pkg/products/update_product.go
Контроллер (снова)
Теперь нам нужно снова изменить файл контроллера. На этот раз мы добавим обработчик, который мы только что создали.
Давайте изменим файл pkg/products/controller.go с
Меняем на:
Bootstrap
Кроме того, нам нужно инициализировать config, базу данных и маршруты.
Добавим код в cmd/main.go
Makefile
Чтобы сократить наши команды, мы используем Makefile для вызова этих команд с помощью make ....
Dockerfile
В этом Dockerfile мы вызываем образ golang:1.18.
Добавим код в Dockerfile
Docker Compose
Прежде чем мы запустим контейнер для нашего приложения, нам нужно создать контейнер Postgres. В нем мы проводим проверку работоспособности. Иначе наше приложение может запуститься до того, как будет создана база данных.
Давайте добавим код в docker-compose.yml
Команды
Запустить приложение
$ docker-compose up
Остановить приложение
$ docker-compose down
Консольный вывод в терминале при запуске docker-compose:
Тестирование
Теперь мы можем протестировать два маршрута, которые мы только что создали. Мы можем протестировать их, используя такие программы, как Postman, Insomnia, или просто запустить команды CURL.
POST: Добавить новый продукт
$ curl --request POST \
--url http://localhost:3000/products \
--header 'Content-Type: application/json' \
--data '{
"name": "Apple iPhone 13",
"stock": 100,
"price": 999
}'
Не забывайте, что команды GET можно выполнять и в браузере.
$ curl --request GET --url http://localhost:3000/products
GET: Получить продукт по ID
$ curl --request GET --url http://localhost:3000/products/1
PUT: Обновить продукт по ID
$ curl --request PUT \
--url http://localhost:3000/products/1 \
--header 'Content-Type: application/json' \
--data '{
"name": "Apple iPhone 13",
"stock": 50,
"price": 999
}'
DELETE: Удаление продукта по идентификатору
$ curl --request DELETE --url http://localhost:3000/products/1
Мы закончили! Отлично. Не забудьте, что я выложил этот проект на Github.