Golang е един от най-добре плащащите и търсени езици за програмиране с много приложения. Когато сте сдвоени с рамки като Gin, Revel и gorilla/mux, можете лесно да създадете API с Go.

Научете как да създадете CRUD API в Golang с помощта на Gin HTTP framework.

Първоначална настройка и инсталация

Започнете с Golang като го инсталирате на вашия компютър, ако още не сте го направили.

Веднъж инсталирана, следващата стъпка е да създадете основна папка на проекта на вашата машина и да инициализирате Go модул в тази основна директория.

За да направите това, отворете CLI, отидете до главната папка на вашия проект и изпълнете:

go mod init име на_модул

Ще видите името на вашия модул (напр. CRUD_API) и неговата версия, когато отворите go.mod файл. Всички персонализирани пакети ще идват от този родителски модул. Така че всеки импортиран персонализиран пакет приема формата:

импортиране(пакет CRUD_API/пакет-име-на-директория)

След това инсталирайте пакетите, необходими за създаване на CRUD API. В този случай използвайте Джин Гоник за маршрутизиране на крайните точки на API:

instagram viewer
отивам получавам github.com/gin-gonic/gin

Сега инсталирайте драйвера MongoDB за съхраняване на данни:

отивам получавам go.mongodb.org/mongo-driver/mongo

Как да се свържете Отидете на MongoDB

Всичко, от което се нуждаете, е вашият MongoDB URI, за да свържете Golang с базата данни. Обикновено изглежда така, ако се свързвате към MongoDB Atlas локално:

Mongo_URL = "mongodb://127.0.0.1:27017"

Сега създайте нова папка в основната директория на вашия проект и я извикайте бази данни. Създайте Go файл в тази папка и го наименувайте база данни.go.

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

пакет база данни

импортиране (
"контекст"
"fmt"
"дневник"
"време"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)

функ ConnectDB() *монго. Клиент {
Mongo_URL := "mongodb://127.0.0.1:27017"
клиент, грешка := mongo. Нов клиент (опции. Client().ApplyURI(Mongo_URL))

if err != nil {
дневник.Фатално(грешка)
}

ctx, отмени := контекст. WithTimeout (контекст. Фон(), 10 * време. второ)
грешка = клиент. Свързване (ctx)
отложи отмени()

if err != nil {
дневник.Фатално(грешка)
}

fmt. Println("Свързан с mongoDB")
връщане клиент
}

Най-добрата практика е да скриете променливите на средата като низа за свързване към базата данни в a .env файл с помощта на пакета dotenv. Това прави вашия код по-преносим и е полезен, когато използвате a Екземпляр на облачен клъстер MongoDB, например.

The ConnectDB функцията установява връзка и връща нов клиентски обект на MongoDB.

Създаване на колекция от бази данни

MongoDB съхранява данни в колекции, които осигуряват интерфейс към основните данни на базата данни.

За да се справите с функционалността за извличане на колекция, започнете със създаване на нова папка, колекция, в корена на вашия проект. Сега създайте нов Go файл, getCollection.go, който получава колекцията от базата данни:

пакет getcollection

импортиране (
"go.mongodb.org/mongo-driver/mongo"
)

функGetCollection(клиент *монго.Клиент, колекцияNameниз) *монго.Колекция {
колекция := клиент. База данни("myGoappDB").Колекция("Публикации")
връщане колекция
}

Тази функция получава колекцията от базата данни MongoDB. Името на базата данни в този случай е myGoappDB, с Публикации като негова колекция.

Създайте модела на базата данни

Направете нова папка във вашата главна директория и я извикайте модел. Тази папка обработва вашия модел на база данни.

Създайте нов Go файл в тази папка и го извикайте model.go. Вашият модел в този случай е публикация в блог със заглавие:

пакет модел

импортиране (
"go.mongodb.org/mongo-driver/bson/primitive"
)

Тип Публикувайте структура {
документ за самоличностпримитивен.ObjectID
Заглавен низ
Низ на статия
}

Създаване на CRUD API с Go

Следва създаването на CRUD API. За да започнете с този раздел, направете нова папка в основната директория на вашия проект, за да управлявате вашите крайни точки. Обади се маршрути.

Създайте отделен Go файл в тази папка за всяко действие. Например, можете да ги наименувате create.go, read.go, update.go, и delete.go. Ще експортирате тези манипулатори като маршрути пакет.

Как да създадете крайната точка на POST в Go

Започнете с дефиниране на крайната точка на POST за запис на данни в базата данни.

Вътре routes/create.go, добавете следното:

пакет маршрути

импортиране (
getcollection "CRUD_API/Колекция"
база данни "CRUD_API/бази данни"
модел "CRUD_API/модел"
"контекст"
"дневник"
"net/http"
"време"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson/primitive"
)

функ Създаване на публикация(c *gin. контекст){
вар DB = база данни. ConnectDB()
var postCollection = getcollection. GetCollection (DB, "Публикации")
ctx, отмени := контекст. WithTimeout (контекст. Фон(), 10*време. второ)
пост := нов(модел. публикации)
отложи отмени()

if err := c. BindJSON(&пост); грешка != нула {
° С. JSON(http. StatusBadRequest, джин. H{"съобщение": грешка})
дневник.Фатално(грешка)
връщане
}

postPayload := модел. публикации{
Документ за самоличност: примитивен.NewObjectID(),
Заглавие: пост.Заглавие,
статия: пост.Статия,
}

резултат, грешка := postCollection. InsertOne (ctx, postPayload)

if err != nil {
° С. JSON(http. StatusInternalServerError, gin. H{"съобщение": грешка})
връщане
}

° С. JSON(http. СтатусСъздаден, джин. H{"съобщение": "Публикувано успешно", "Данни": карта[низ]интерфейс{}{"данни": резултат}})
}

Този код започва с импортиране на потребителски модули на проекта. След това импортира пакети на трети страни, включително Джин и MongoDB драйвер.

Освен това, postCollection съхранява колекцията от база данни. По-специално, ° С. BindJSON("публикуване") е екземпляр на модел JSON, който извиква всяко поле на модел като postPayload; това влиза в базата данни.

Как да създадете GET крайна точка

Крайната точка GET, в routes/read.go, чете един документ от базата данни чрез неговия уникален идентификатор. Също така започва с импортиране на персонализирани пакети и пакети на трети страни:

пакет маршрути

импортиране (
getcollection "CRUD_API/Колекция"
база данни "CRUD_API/бази данни"
модел "CRUD_API/модел"
"контекст"
"net/http"
"време"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)

функ ReadOnePost(c *gin. контекст){
ctx, отмени := контекст. WithTimeout (контекст. Фон(), 10*време. второ)
вар DB = база данни. ConnectDB()
var postCollection = getcollection. GetCollection (DB, "Публикации")

postId := c. Параметр("postId")
вар резултат модел. Публикации

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

objId, _ := примитивен. ObjectIDFromHex (postId)

err := postCollection. FindOne (ctx, bson. M{"документ за самоличност": objId}).Декодиране(&резултат)

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

if err != nil {
° С. JSON(http. StatusInternalServerError, gin. H{"съобщение": грешка})
връщане
}

° С. JSON(http. СтатусСъздаден, джин. H{"съобщение": "успех!", "Данни": res})
}

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

Въпреки това, резултат е екземпляр на модела на базата данни, който по-късно съхранява върнатия документ като рез.

Как да създадете крайна точка PUT

Манипулаторът PUT, в routes/update.go, е подобен на POST манипулатора. Този път той актуализира съществуваща публикация чрез нейния уникален идентификатор на обект:

пакет маршрути

импортиране (
getcollection "CRUD_API/Колекция"
база данни "CRUD_API/бази данни"
модел "CRUD_API/модел"
"контекст"
"net/http"
"време"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)

функ UpdatePost(c *gin. контекст){
ctx, отмени := контекст. WithTimeout (контекст. Фон(), 10 * време. второ)
вар DB = база данни. ConnectDB()
var postCollection = getcollection. GetCollection (DB, "Публикации")

postId := c. Параметр("postId")
вар пост модел. Публикации

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

objId, _ := примитивен. ObjectIDFromHex (postId)

if err := c. BindJSON(&пост); грешка != нула {
° С. JSON(http. StatusInternalServerError, gin. H{"съобщение": грешка})
връщане
}

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

резултат, грешка := postCollection. UpdateOne (ctx, bson. M{"документ за самоличност": objId}, bson. M{"$set": редактирано})

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

if err != nil {
° С. JSON(http. StatusInternalServerError, gin. H{"съобщение": грешка})
връщане
}

ако резултат. MatchedCount < 1 {
° С. JSON(http. StatusInternalServerError, gin. H{"съобщение": "Данните не'т съществува"})
връщане
}

° С. JSON(http. СтатусСъздаден, джин. H{"съобщение": "данните са актуализирани успешно!", "Данни": res})
}

JSON формат на екземпляра на модела (пост) извиква всяко поле на модел от базата данни. Резултатната променлива използва MongoDB $set оператор за актуализиране на изискван документ, извикан от неговия идентификатор на обект.

The резултат. MatchedCount условие предотвратява изпълнението на кода, ако няма запис в базата данни или предаденият идентификатор е невалиден.

Създаване на DELETE крайна точка

Крайната точка DELETE, в delete.go, премахва документ въз основа на идентификатора на обекта, подаден като URL параметър:

пакет маршрути

импортиране (
getcollection "CRUD_API/Колекция"
база данни "CRUD_API/бази данни"
"контекст"
"net/http"
"време"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)

функ Изтриване на публикация(c *gin. контекст){
ctx, отмени := контекст. WithTimeout (контекст. Фон(), 10*време. второ)
вар DB = база данни. ConnectDB()
postId := c. Параметр("postId")

var postCollection = getcollection. GetCollection (DB, "Публикации")
отложи отмени()
objId, _ := примитивен. ObjectIDFromHex (postId)
резултат, грешка := postCollection. DeleteOne (ctx, bson. M{"документ за самоличност": objId})
res := карта [низ]интерфейс{}{"данни": резултат}

if err != nil {
° С. JSON(http. StatusInternalServerError, gin. H{"съобщение": грешка})
връщане
}

ако резултат. DeletedCount < 1 {
° С. JSON(http. StatusInternalServerError, gin. H{"съобщение": "Няма данни за изтриване"})
връщане
}

° С. JSON(http. СтатусСъздаден, джин. H{"съобщение": "Статията е изтрита успешно", "Данни": res})
}

Този код изтрива запис с помощта на DeleteOne функция. Той също така използва резултат. DeletedCount свойство, за да предотврати изпълнението на кода, ако базата данни е празна или идентификаторът на обекта е невалиден.

Създайте файла за изпълнение на API

Накрая създайте a main.go в главната директория на вашия проект. Вашата окончателна структура на проекта трябва да изглежда така:

Този файл управлява изпълнението на рутера за всяка крайна точка:

пакет основен

импортиране (
маршрути "CRUD_API/маршрути"
"github.com/gin-gonic/gin"
)

функ основен(){
рутер := джин.По подразбиране()

рутер. ПУБЛИКУВАЙ ("/", маршрути. CreatePost)

// извикан като localhost: 3000/getOne/{id}
рутер. GET("getOne/:postId", маршрути. ReadOnePost)

// наричан като localhost: 3000/актуализация/{документ за самоличност}
рутер. СЛАГАМ("/update/:postId", маршрути. UpdatePost)

// наричан като localhost: 3000/Изтрий/{документ за самоличност}
рутер. ИЗТРИЙ("/Изтрий/:postId", маршрути. DeletePost)

рутер. бягай("локален хост: 3000")
}

Този файл е основният пакет, който изпълнява други файлове. Започва с импортиране на манипулатори на маршрути. Следващото е рутер променлива, a джин екземпляр, който предизвиква HTTP действията и извиква всяка крайна точка с нейното име на функция от маршрути пакет.

Вашият CRUD проект продължава локален хост: 3000. За да стартирате сървъра и тествайте CRUD API, изпълнете следната команда във вашата основна директория:

отивамтичамосновен.отивам

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

Успешно създадохте CRUD API с Go; Честито! Въпреки че това е малък проект, видяхте какво е необходимо за изпълнение на редовни HTTP заявки в Go.

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