Найти в Дзене
Golang

Простой API на Go с помощью Fiber и Docker (2022)

Оглавление

Создание простого 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:

-2

Тестирование

Теперь мы можем протестировать два маршрута, которые мы только что создали. Мы можем протестировать их, используя такие программы, как 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.

Golang Jobs

Golang

Что-то пошло не так, и нам не удалось загрузить комментарии. Попробуйте ещё раз
Рекомендуем почитать
Архитектура Docker
Технологии контейнеризации в последние годы стали важнейшей частью современной DevOps-инфраструктуры. Среди них особенно выделяется Docker - платформа, изменившая подход к упаковке, распространению и запуску приложений. В этой статье мы подробно разберем архитектуру Docker, ее основные компоненты, а также системные технологии, обеспечивающие изоляцию и безопасность контейнеров. основе Docker лежит клиент-серверная модель, обеспечивающая взаимодействие между пользователем и системой управления контейнерами...
Что такое "вайбкодинг" и заменят ли "вайбкодеры" программистов?
Вайбкодинг — это новый тренд программирования, который родился на волне хайпа нейросетей. Простыми словами это работает так: ты пишешь запрос нейросети (к примеру ChatGPT), а она выдает тебе готовый код. На фоне этого появилось множество "псевдо программистов", называемых себя "вайбкодерами". Также стало появляться все больше редакторов кода со встроенным ИИ ассистентом уже с коробки. Одним из таких является Coursor AI. В этой статье рассмотрим вайбкодинг поближе и разберемся заменят ли "вайбкодеры" программистов...
От разработки OpenSource-проекта опять отключили разработчика
От разработки OpenSource-проекта опять отключили разработчика. И, по всей видимости, на этот раз не за гражданство, а за политические взгляды, но не все так однозначно. Один из разработчика "иксов", системы, которая обеспечивает работу графических интерфейсов в линукс, создал форк под названием X11Libre. И сделал это Enrico Weigelt, он же metux, по причине того, что его учетная запись и все коммиты были стерты с сайта проекта. Что же послужило причиной удаления? На то называется две причины, одна политическая, вторая техническая, и какая внесла больший вклад - сложно сказать...
Следующая статья
Документы, вакансии и контакты