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:
отивам получавам 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 е подходящ език за програмиране за редица случаи на употреба.