Голанг је један од најплаћенијих, тражених програмских језика са много апликација. Када сте упарени са оквирима као што су Гин, Ревел и горилла/мук, можете лако да креирате АПИ са Го.

Научите како да креирате ЦРУД АПИ у Голангу користећи Гин ХТТП оквир.

Почетно подешавање и инсталација

Започните са Голангом тако што ћете га инсталирати на рачунар ако то већ нисте урадили.

Једном инсталиран, следећи корак је креирање основне фасцикле пројекта на вашој машини и иницијализација Го модула у том основном директоријуму.

Да бисте то урадили, отворите а ЦЛИ, идите до коренске фасцикле вашег пројекта и покрените:

го мод инит модуле_наме

Видећете назив свог модула (нпр. ЦРУД_АПИ) и његову верзију када отворите го.мод фајл. Сви прилагођени пакети ће доћи из овог родитељског модула. Дакле, сваки увезени прилагођени пакет има облик:

увоз(пакет ЦРУД_АПИ/пакет-име-директоријума)

Затим инсталирајте пакете неопходне за креирање ЦРУД АПИ-ја. У овом случају користите Гин Гониц да усмерите крајње тачке АПИ-ја:

иди добити гитхуб.цом/гин-гониц/гин
instagram viewer

Сада инсталирајте МонгоДБ драјвер за складиштење података:

иди добити го.монгодб.орг/монго-дривер/монго

Како се повезати Идите на МонгоДБ

Све што вам треба је ваш МонгоДБ УРИ да повежете Голанг са базом података. Обично изгледа овако ако се повезујете на МонгоДБ Атлас локално:

Монго_УРЛ = "монгодб://127.0.0.1:27017"

Сада креирајте нову фасциклу у основном директоријуму вашег пројекта и позовите је базе података. Направите Го датотеку унутар ове фасцикле и дајте јој назив база података.го.

Ово је ваш пакет базе података и почиње увозом потребних библиотека:

пакет база података

увоз (
"контекст"
"фмт"
"Пријава"
"време"
"го.монгодб.орг/монго-дривер/монго"
"го.монгодб.орг/монго-дривер/монго/оптионс"
)

фунц ЦоннецтДБ() *монго. Клијент {
Монго_УРЛ := "монгодб://127.0.0.1:27017"
клијент, грешка := монго. Нови клијент (опције. Клијент().ПримениУРИ(Монго_УРЛ))

ако грешка != нил {
Пријава.Фатал(ерр)
}

цтк, откажи := контекст. ВитхТимеоут (контекст. Бацкгроунд(), 10 * време. друго)
ерр = клијент. Повежи (цтк)
одложити цанцел()

ако грешка != нил {
Пријава.Фатал(ерр)
}

фмт. Принтлн("Повезано са монгоДБ")
повратак клијент
}

Најбоља пракса је да сакријете променљиве окружења као што је стринг везе са базом података у а .енв фајл користећи пакет дотенв. Ово чини ваш код преносивијим и згодно је када користите а МонгоДБ кластер инстанца, на пример.

Тхе ЦоннецтДБ функција успоставља везу и враћа нови МонгоДБ Цлиент објекат.

Креирајте колекцију базе података

МонгоДБ складишти податке у збиркама, које пружају интерфејс за основне податке базе података.

Да бисте управљали функцијом преузимања колекције, почните креирањем нове фасцикле, Цоллецтион, у корену вашег пројекта. Сада креирајте нову Го датотеку, гетЦоллецтион.го, који добија колекцију из базе података:

пакет гетцоллецтион

увоз (
"го.монгодб.орг/монго-дривер/монго"
)

фунцГетЦоллецтион(клијент *монго.Клијент, цоллецтионНамениз) *монго.Цоллецтион {
збирка := клијент. База података("миГоаппДБ").Колекција("Постови")
повратак збирка
}

Ова функција добија колекцију из МонгоДБ базе података. Име базе података, у овом случају, јесте миГоаппДБ, са Постови као његова збирка.

Креирајте модел базе података

Направите нову фасциклу у свом основном директоријуму и позовите је модел. Ова фасцикла управља вашим моделом базе података.

Направите нову Го датотеку унутар те фасцикле и позовите је модел.го. Ваш модел, у овом случају, је пост на блогу са насловом:

пакет модел

увоз (
"го.монгодб.орг/монго-дривер/бсон/примитиве"
)

тип Структура поста {
ИДпримитивни.ОбјецтИД
Наслов стринг
Стринг чланка
}

Креирање ЦРУД АПИ-ја са Го

Следеће је креирање ЦРУД АПИ-ја. Да бисте започели са овим одељком, направите нову фасциклу у основном директоријуму вашег пројекта за руковање вашим крајњим тачкама. Позовите га руте.

Направите засебну Го датотеку у овој фасцикли за сваку радњу. На пример, можете их именовати цреате.го, реад.го, упдате.го, и делете.го. Ове обрађиваче ћете извести као руте пакет.

Како креирати ПОСТ крајњу тачку у Го

Почните тако што ћете дефинисати ПОСТ крајњу тачку за уписивање података у базу података.

У руте/креирај.иди, додајте следеће:

пакет руте

увоз (
гетцоллецтион "ЦРУД_АПИ/Колекција"
база података "ЦРУД_АПИ/базе података"
модел "ЦРУД_АПИ/модел"
"контекст"
"Пријава"
"нет/хттп"
"време"
"гитхуб.цом/гин-гониц/гин"
"го.монгодб.орг/монго-дривер/бсон/примитиве"
)

фунц ЦреатеПост(ц *џин. Контекст){
вар ДБ = база података. ЦоннецтДБ()
вар постЦоллецтион = гетцоллецтион. ГетЦоллецтион (ДБ, "Постови")
цтк, откажи := контекст. ВитхТимеоут (контекст. Бацкгроунд(), 10*пут. друго)
пост := Нова(модел. постови)
одложити цанцел()

ако грешка := ц. БиндЈСОН(&пошта); грешка != нил {
ц. ЈСОН(хттп. СтатусБадРекуест, гин. Х{"порука":ерр})
Пријава.Фатал(ерр)
повратак
}

постПаилоад := модел. постови{
Ид: примитивни.НевОбјецтИД(),
Наслов: пошта.Титле,
Чланак: пошта.Чланак,
}

резултат, ерр := постЦоллецтион. ИнсертОне (цтк, постПаилоад)

ако грешка != нил {
ц. ЈСОН(хттп. СтатусИнтерналСерверЕррор, гин. Х{"порука":ерр})
повратак
}

ц. ЈСОН(хттп. СтатусЦреатед, џин. Х{"порука": "Успешно објављено", "Подаци": мап[стринг]интерфејс{}{"података": резултат}})
}

Овај код почиње увозом прилагођених модула пројекта. Затим увози пакете треће стране, укључујући Џин и МонгоДБ драјвер.

даље, постЦоллецтион држи колекцију базе података. Посебно, ц. БиндЈСОН("пост") је ЈСОНифицирана инстанца модела која свако поље модела позива као постПаилоад; ово иде у базу података.

Како да креирате ГЕТ крајњу тачку

ГЕТ крајња тачка, у руте/читај.иди, чита један документ из базе података преко свог јединственог ИД-а. Такође почиње увозом прилагођених пакета и пакета трећих страна:

пакет руте

увоз (
гетцоллецтион "ЦРУД_АПИ/Колекција"
база података "ЦРУД_АПИ/базе података"
модел "ЦРУД_АПИ/модел"
"контекст"
"нет/хттп"
"време"
"гитхуб.цом/гин-гониц/гин"
"го.монгодб.орг/монго-дривер/бсон"
"го.монгодб.орг/монго-дривер/бсон/примитиве"
)

фунц РеадОнеПост(ц *џин. Контекст){
цтк, откажи := контекст. ВитхТимеоут (контекст. Бацкгроунд(), 10*пут. друго)
вар ДБ = база података. ЦоннецтДБ()
вар постЦоллецтион = гетцоллецтион. ГетЦоллецтион (ДБ, "Постови")

постИд := ц. Парам("постИд")
вар модел резултата. Постови

одложити цанцел()

објИд, _ := примитивно. ОбјецтИДФромХек (постИд)

ерр := постЦоллецтион. ФиндОне (цтк, бсон. М{"ид": објИд}).Декодирај(&резултат)

рес := мапа[стринг]интерфејс{}{"подаци": резултат}

ако грешка != нил {
ц. ЈСОН(хттп. СтатусИнтерналСерверЕррор, гин. Х{"порука":ерр})
повратак
}

ц. ЈСОН(хттп. СтатусЦреатед, џин. Х{"порука": "успех!", "Подаци": рес})
}

Тхе постИд променљива је декларација параметра. Добија ИД објекта документа као објИд.

Међутим, резултат је инстанца модела базе података, која касније држи враћени документ као рес.

Како да креирате ПУТ крајњу тачку

ПУТ руковалац, у роутес/упдате.го, је сличан ПОСТ руковаоцу. Овај пут ажурира постојећи пост помоћу јединственог ИД-а објекта:

пакет руте

увоз (
гетцоллецтион "ЦРУД_АПИ/Колекција"
база података "ЦРУД_АПИ/базе података"
модел "ЦРУД_АПИ/модел"
"контекст"
"нет/хттп"
"време"
"гитхуб.цом/гин-гониц/гин"
"го.монгодб.орг/монго-дривер/бсон"
"го.монгодб.орг/монго-дривер/бсон/примитиве"
)

фунц УпдатеПост(ц *џин. Контекст){
цтк, откажи := контекст. ВитхТимеоут (контекст. Бацкгроунд(), 10 * време. друго)
вар ДБ = база података. ЦоннецтДБ()
вар постЦоллецтион = гетцоллецтион. ГетЦоллецтион (ДБ, "Постови")

постИд := ц. Парам("постИд")
вар пост модел. Постови

одложити цанцел()

објИд, _ := примитивно. ОбјецтИДФромХек (постИд)

ако грешка := ц. БиндЈСОН(&пошта); грешка != нил {
ц. ЈСОН(хттп. СтатусИнтерналСерверЕррор, гин. Х{"порука":ерр})
повратак
}

едитед := бсон. М{"наслов": пошта. наслов, "чланак": пошта. чланак}

резултат, ерр := постЦоллецтион. УпдатеОне (цтк, бсон. М{"ид": објИд}, бсон. М{"$сет": едитед})

рес := мапа[стринг]интерфејс{}{"подаци": резултат}

ако грешка != нил {
ц. ЈСОН(хттп. СтатусИнтерналСерверЕррор, гин. Х{"порука":ерр})
повратак
}

ако резултат. МатцхедЦоунт < 1 {
ц. ЈСОН(хттп. СтатусИнтерналСерверЕррор, гин. Х{"порука": "Подаци не'т постоји"})
повратак
}

ц. ЈСОН(хттп. СтатусЦреатед, џин. Х{"порука": "подаци су успешно ажурирани!", "Подаци": рес})
}

ЈСОН формат инстанце модела (пошта) позива свако поље модела из базе података. Променљива резултата користи МонгоДБ $сет оператора за ажурирање потребног документа који се зове његов ИД објекта.

Тхе резултат. МатцхедЦоунт услов спречава покретање кода ако нема записа у бази података или је прослеђени ИД неважећи.

Креирање крајње тачке ДЕЛЕТЕ

Крајња тачка ДЕЛЕТЕ, у делете.го, уклања документ на основу ИД-а објекта који је прослеђен као УРЛ параметар:

пакет руте

увоз (
гетцоллецтион "ЦРУД_АПИ/Колекција"
база података "ЦРУД_АПИ/базе података"
"контекст"
"нет/хттп"
"време"
"гитхуб.цом/гин-гониц/гин"
"го.монгодб.орг/монго-дривер/бсон"
"го.монгодб.орг/монго-дривер/бсон/примитиве"
)

фунц ДелетеПост(ц *џин. Контекст){
цтк, откажи := контекст. ВитхТимеоут (контекст. Бацкгроунд(), 10*пут. друго)
вар ДБ = база података. ЦоннецтДБ()
постИд := ц. Парам("постИд")

вар постЦоллецтион = гетцоллецтион. ГетЦоллецтион (ДБ, "Постови")
одложити цанцел()
објИд, _ := примитивно. ОбјецтИДФромХек (постИд)
резултат, ерр := постЦоллецтион. ДелетеОне (цтк, бсон. М{"ид": објИд})
рес := мапа[стринг]интерфејс{}{"подаци": резултат}

ако грешка != нил {
ц. ЈСОН(хттп. СтатусИнтерналСерверЕррор, гин. Х{"порука":ерр})
повратак
}

ако резултат. ДелетедЦоунт < 1 {
ц. ЈСОН(хттп. СтатусИнтерналСерверЕррор, гин. Х{"порука": "Нема података за брисање"})
повратак
}

ц. ЈСОН(хттп. СтатусЦреатед, џин. Х{"порука": "Чланак је успешно избрисан", "Подаци": рес})
}

Овај код брише запис користећи ДелетеОне функција. Такође користи резултат. ДелетедЦоунт својство да спречи покретање кода ако је база података празна или је ИД објекта неважећи.

Креирајте датотеку АПИ Руннер

На крају, креирајте а маин.го унутар вашег основног директоријума пројекта. Ваша коначна структура пројекта би требало да изгледа овако:

Ова датотека управља извршавањем рутера за сваку крајњу тачку:

пакет главни

увоз (
руте "ЦРУД_АПИ/руте"
"гитхуб.цом/гин-гониц/гин"
)

фунц главни(){
рутер := гин.Уобичајено()

рутер. ПОШТА("/", руте. ЦреатеПост)

// позван као локални хост: 3000/гетОне/{ид}
рутер. ДОБИТИ("гетОне/:постИд", руте. РеадОнеПост)

// зове се локални хост: 3000/ажурирање/{ид}
рутер. СТАВИТИ("/update/:postId", руте. УпдатеПост)

// зове се локални хост: 3000/избрисати/{ид}
рутер. ИЗБРИШИ("/избрисати/:постИд", руте. ДелетеПост)

рутер. Трцати("локални хост: 3000")
}

Ова датотека је главни пакет који покреће друге датотеке. Почиње увозом руковаоца рута. Следеће је рутер променљива, а џин инстанца која изазива ХТТП радње и позива сваку крајњу тачку именом њене функције из руте пакет.

Ваш ЦРУД пројекат ради даље локални хост: 3000. Да бисте покренули сервер и тестирајте ЦРУД АПИ, покрените следећу команду у свом основном директоријуму:

идитрцатиглавни.го

Претворите свој Голанг ЦРУД пројекат у употребљив производ

Успешно сте креирали ЦРУД АПИ са Го; Честитам! Иако је ово мањи пројекат, видели сте шта је потребно за извршавање редовних ХТТП захтева у Го.

Можете постати креативнији тако што ћете ово проширити у практичнију апликацију која корисницима доноси вредност. Го је погодан програмски језик за низ случајева употребе.