Golang — один из самых высокооплачиваемых и востребованных языков программирования со множеством приложений. В сочетании с такими фреймворками, как Gin, Revel и gorilla/mux, вы можете легко создать API с помощью Go.

Узнайте, как создать CRUD API в Golang с помощью HTTP-фреймворка Gin.

Первоначальная настройка и установка

Начать работу с Голангом установив его на свой компьютер, если вы еще этого не сделали.

После установки следующим шагом будет создание корневой папки проекта на вашем компьютере и инициализация модуля Go в этом корневом каталоге.

Для этого откройте интерфейс командной строки, перейдите в корневую папку проекта и запустите:

перейти мод init имя_модуля

Вы увидите имя вашего модуля (например, CRUD_API) и его версия при открытии go.mod файл. Все пользовательские пакеты будут исходить из этого родительского модуля. Таким образом, любой импортированный пользовательский пакет имеет вид:

импорт(упаковка CRUD_API/упаковка-имя-каталога)

Затем установите пакеты, необходимые для создания CRUD API. В этом случае используйте Джин Гоник для маршрутизации конечных точек API:

instagram viewer
идти получить github.com/джин-гоник/джин

Теперь установите драйвер MongoDB для хранения данных:

идти получить go.mongodb.org/монго-драйвер/монго

Как подключиться Перейти к MongoDB

Все, что вам нужно, это ваш URI MongoDB для подключения Golang к базе данных. Обычно это выглядит так, если вы подключаетесь к MongoDB Atlas локально:

Mongo_URL = "монгодб://127.0.0.1:27017"

Теперь создайте новую папку в корневом каталоге вашего проекта и назовите ее базы данных. Создайте файл Go внутри этой папки и назовите его база данных.go.

Это ваш пакет базы данных, и он начинается с импорта необходимых библиотек:

упаковка база данных

импорт (
"контекст"
"ФМТ"
"журнал"
"время"
"go.mongodb.org/монго-драйвер/монго"
"go.mongodb.org/монго-драйвер/монго/параметры"
)

функция ConnectDB() *монго. Клиент {
Mongo_URL := "монгодб://127.0.0.1:27017"
клиент, ошибаюсь := монго. Новый клиент (параметры. Клиент().ApplyURI(Mongo_URL))

если ошибка != ноль {
журнал.фатальный(ошибаться)
}

ctx, отмена := контекст. С таймаутом (контекст. Фон (), 10 * время. Второй)
ошибка = клиент. Подключить (ctx)
отложить отмену()

если ошибка != ноль {
журнал.фатальный(ошибаться)
}

ФМТ. Распечатать("Подключен к монгодб")
возвращаться клиент
}

Лучше всего скрывать переменные среды, такие как строка подключения к базе данных, в .env файл с помощью пакета dotenv. Это сделает ваш код более переносимым и пригодится при использовании Экземпляр облачного кластера MongoDB, Например.

ConnectDB Функция устанавливает соединение и возвращает новый объект клиента MongoDB.

Создать коллекцию баз данных

MongoDB хранит данные в коллекциях, которые обеспечивают интерфейс для данных базовой базы данных.

Чтобы реализовать функцию извлечения коллекции, начните с создания новой папки, Коллекция, в корне вашего проекта. Теперь создайте новый файл Go, getCollection.go, который получает коллекцию из базы данных:

упаковка получитьколлекцию

импорт (
"go.mongodb.org/монго-драйвер/монго"
)

функцияПолучитьКоллекцию(клиент *монго.Клиент, имя коллекциинить) *монго.Коллекция {
коллекция := клиент. База данных("myGoappDB").Коллекция("Сообщения")
возвращаться коллекция
}

Эта функция получает коллекцию из базы данных MongoDB. Имя базы данных в этом случае myGoappDB, с Сообщения как его сборник.

Создайте модель базы данных

Создайте новую папку в корневом каталоге и назовите ее модель. Эта папка обрабатывает вашу модель базы данных.

Создайте новый файл Go внутри этой папки и назовите его модель.го. Ваша модель в данном случае представляет собой сообщение в блоге с заголовком:

упаковка модель

импорт (
"go.mongodb.org/монго-драйвер/bson/примитивный"
)

тип Структура сообщения {
Я БЫпримитивный.ObjectID
Строка заголовка
Строка статьи
}

Создание CRUD API с помощью Go

Далее следует создание CRUD API. Чтобы начать с этого раздела, создайте новую папку в корневом каталоге вашего проекта для обработки ваших конечных точек. Назови это маршруты.

Создайте в этой папке отдельный файл Go для каждого действия. Например, вы можете назвать их создать.go, read.go, update.go, а также удалить.go. Вы экспортируете эти обработчики как маршруты упаковка.

Как создать конечную точку POST в Go

Начните с определения конечной точки POST для записи данных в базу данных.

Внутри маршруты/create.go, добавьте следующее:

упаковка маршруты

импорт (
получитьколлекцию "CRUD_API/коллекция"
база данных "CRUD_API/базы данных"
модель "CRUD_API/модель"
"контекст"
"журнал"
"сеть/http"
"время"
"github.com/джин-гоник/джин"
"go.mongodb.org/монго-драйвер/bson/примитивный"
)

функция Создать сообщение(с *джин. контекст){
вар БД = база данных. Подключить БД()
var postCollection = получитьколлекцию. GetCollection (БД, "Сообщения")
ctx, отмена := контекст. С таймаутом (контекст. Фон(), 10*время. Второй)
пост := новый(модель. сообщения)
отложить отмену()

если ошибся := c. СвязатьJSON(&почта); ошибка != ноль {
в. JSON (http. СтатусBadRequest, джин. ЧАС{"сообщение": эээ })
журнал.фатальный(ошибаться)
возвращаться
}

postPayload := модель. Сообщения{
Идентификатор: примитивный.NewObjectID(),
Заголовок: почта.Заголовок,
Статья: почта.Статья,
}

результат, ошибка := postCollection. InsertOne (ctx, postPayload)

если ошибка != ноль {
в. JSON (http. StatusInternalServerError, джин. ЧАС{"сообщение": эээ })
возвращаться
}

в. JSON (http. Статус Создан, джин. ЧАС{"сообщение": "Опубликовано успешно", "Данные": карта[строка]интерфейс{}{"данные": результат}})
}

Этот код начинается с импорта пользовательских модулей проекта. Затем он импортирует сторонние пакеты, включая Джин а также Драйвер MongoDB.

Дальше, postCollection содержит коллекцию базы данных. Примечательно, в. BindJSON ("сообщение") представляет собой экземпляр модели JSONified, который вызывает каждое поле модели как postPayload; это входит в базу данных.

Как создать конечную точку GET

Конечная точка GET в маршруты /read.go, считывает один документ из базы данных по его уникальному идентификатору. Он также начинается с импорта пользовательских и сторонних пакетов:

упаковка маршруты

импорт (
получитьколлекцию "CRUD_API/коллекция"
база данных "CRUD_API/базы данных"
модель "CRUD_API/модель"
"контекст"
"сеть/http"
"время"
"github.com/джин-гоник/джин"
"go.mongodb.org/mongo-драйвер/bson"
"go.mongodb.org/монго-драйвер/bson/примитивный"
)

функция ReadOnePost(с *джин. контекст){
ctx, отмена := контекст. С таймаутом (контекст. Фон(), 10*время. Второй)
вар БД = база данных. Подключить БД()
var postCollection = получитьколлекцию. GetCollection (БД, "Сообщения")

идентификатор сообщения := c. Парам("postId")
вар модель результата. Сообщения

отложить отмену()

objId, _ := примитив. ObjectIDFromHex (идентификатор сообщения)

ошибка := postCollection. FindOne (ctx, bson. М {"я бы": objId}).Декодировать(&результат)

разрешение: = карта [строка]интерфейс{}{"данные": результат}

если ошибка != ноль {
в. JSON (http. StatusInternalServerError, джин. ЧАС{"сообщение": эээ })
возвращаться
}

в. JSON (http. Статус Создан, джин. ЧАС{"сообщение": "успех!", "Данные": разрешение})
}

postId переменная является объявлением параметра. Он получает идентификатор объекта документа как objId.

Однако, результат является экземпляром модели базы данных, которая позже содержит возвращенный документ как разрешение.

Как создать конечную точку PUT

Обработчик PUT, в маршруты /update.go, похож на обработчик POST. На этот раз он обновляет существующий пост по его уникальному идентификатору объекта:

упаковка маршруты

импорт (
получитьколлекцию "CRUD_API/коллекция"
база данных "CRUD_API/базы данных"
модель "CRUD_API/модель"
"контекст"
"сеть/http"
"время"
"github.com/джин-гоник/джин"
"go.mongodb.org/mongo-драйвер/bson"
"go.mongodb.org/монго-драйвер/bson/примитивный"
)

функция ОбновлениеПост(с *джин. контекст){
ctx, отмена := контекст. С таймаутом (контекст. Фон (), 10 * время. Второй)
вар БД = база данных. Подключить БД()
var postCollection = получитьколлекцию. GetCollection (БД, "Сообщения")

идентификатор сообщения := c. Парам("postId")
вар почтовая модель. Сообщения

отложить отмену()

objId, _ := примитив. ObjectIDFromHex (идентификатор сообщения)

если ошибся := c. СвязатьJSON(&почта); ошибка != ноль {
в. JSON (http. StatusInternalServerError, джин. ЧАС{"сообщение": эээ })
возвращаться
}

отредактировано := bson. М {"заглавие": почта. Заголовок, "статья": почта. Статья}

результат, ошибка := postCollection. UpdateOne (ctx, bson. М {"я бы": objId}, bson. М {"$установить": отредактировано})

разрешение: = карта [строка]интерфейс{}{"данные": результат}

если ошибка != ноль {
в. JSON (http. StatusInternalServerError, джин. ЧАС{"сообщение": эээ })
возвращаться
}

если результат. MatchedCount < 1 {
в. JSON (http. StatusInternalServerError, джин. ЧАС{"сообщение": "Данные не'не существует"})
возвращаться
}

в. JSON (http. Статус Создан, джин. ЧАС{"сообщение": "данные успешно обновлены!", "Данные": разрешение})
}

Формат JSON экземпляра модели (почта) вызывает каждое поле модели из базы данных. Переменная результата использует MongoDB $установить оператор для обновления требуемого документа, вызываемого его идентификатором объекта.

результат. MatchedCount Условие предотвращает запуск кода, если в базе данных нет записи или переданный идентификатор недействителен.

Создание конечной точки DELETE

Конечная точка DELETE в удалить.go, удаляет документ на основе идентификатора объекта, переданного в качестве параметра URL:

упаковка маршруты

импорт (
получитьколлекцию "CRUD_API/коллекция"
база данных "CRUD_API/базы данных"
"контекст"
"сеть/http"
"время"
"github.com/джин-гоник/джин"
"go.mongodb.org/mongo-драйвер/bson"
"go.mongodb.org/монго-драйвер/bson/примитивный"
)

функция УдалитьПост(с *джин. контекст){
ctx, отмена := контекст. С таймаутом (контекст. Фон(), 10*время. Второй)
вар БД = база данных. Подключить БД()
идентификатор сообщения := c. Парам("postId")

var postCollection = получитьколлекцию. GetCollection (БД, "Сообщения")
отложить отмену()
objId, _ := примитив. ObjectIDFromHex (идентификатор сообщения)
результат, ошибка := postCollection. УдалитьОдин (ctx, bson. М {"я бы": objId})
разрешение: = карта [строка]интерфейс{}{"данные": результат}

если ошибка != ноль {
в. JSON (http. StatusInternalServerError, джин. ЧАС{"сообщение": эээ })
возвращаться
}

если результат. DeletedCount < 1 {
в. JSON (http. StatusInternalServerError, джин. ЧАС{"сообщение": "Нет данных для удаления"})
возвращаться
}

в. JSON (http. Статус Создан, джин. ЧАС{"сообщение": "Статья успешно удалена", "Данные": разрешение})
}

Этот код удаляет запись с помощью УдалитьОдин функция. Он также использует результат. DeletedCount свойство для предотвращения запуска кода, если база данных пуста или идентификатор объекта недействителен.

Создайте файл запуска API

Наконец, создайте main.go внутри корневого каталога вашего проекта. Ваша окончательная структура проекта должна выглядеть так:

Этот файл обрабатывает выполнение маршрутизатора для каждой конечной точки:

упаковка главный

импорт (
маршруты "CRUD_API/маршруты"
"github.com/джин-гоник/джин"
)

функция главный(){
роутер := джин.По умолчанию()

маршрутизатор. ПОЧТА("/", маршруты. Создать сообщение)

// вызывается как localhost: 3000/getOne/{id}
маршрутизатор. ПОЛУЧИТЬ("getOne/:postId", маршруты. ReadOnePost)

// вызывается как localhost: 3000/Обновить/{я бы}
маршрутизатор. ПОМЕЩАТЬ("/update/:postId", маршруты. ОбновитьПост)

// вызывается как localhost: 3000/Удалить/{я бы}
маршрутизатор. УДАЛИТЬ("/Удалить/:postId", маршруты. УдалитьПост)

маршрутизатор. Бежать("локальный: 3000")
}

Этот файл является основным пакетом, который запускает другие файлы. Он начинается с импорта обработчиков маршрутов. Далее идет маршрутизатор переменная, а Джин экземпляр, который вызывает действия HTTP и вызывает каждую конечную точку по имени ее функции из маршруты упаковка.

Ваш проект CRUD работает на локальный: 3000. Чтобы запустить сервер и протестировать CRUD API, выполните следующую команду в базовом каталоге:

идтибежатьглавный.идти

Превратите свой проект Golang CRUD в полезный продукт

Вы успешно создали CRUD API с помощью Go; поздравляю! Хотя это небольшой проект, вы видели, что нужно для выполнения обычных HTTP-запросов в Go.

Вы можете проявить больше творчества, превратив это в более практичное приложение, которое приносит пользу пользователям. Go — подходящий язык программирования для целого ряда случаев использования.