Shanraq.org Shanraq.org
Go-дағы алғашқы бағдарлама: net/http сервері, 20 минут
IT

Go тілі: нөлден өз блогыңызға дейін 3-сабақ (барлығы 50)

Go-дағы алғашқы бағдарлама: net/http сервері, 20 минут

Go курсының үшінші сабағы. Go-дағы алғашқы бағдарлама және жұмыс істейтін веб-сервер: package main, func main, http.HandleFunc, http.ListenAndServe және 8080 порты. Тілдің бірде-бір ережесін жаттамай тұрып, браузерден өз бағдарламаңыздың жауабын көресіз. Порт бос болмаса, не істеу керек.

Не үшін керек

Өткен сабақта сіз біреудің серверіне клиент жағынан қарадыңыз. Бүгін екінші жаққа шығасыз: браузерге жауап беретін бағдарлама жазасыз.

Бұған жиырма минут кетеді, тілдің бірде-бір ережесін жаттаудың қажеті жоқ. Курстағы қалғанының бәрі — бүгін істейтін ісіңіздің егжей-тегжейі.

Бірден тұтас

Жұмыс орнын өткен сабақта жинап қойдыңыз. Оның қасына жаңа sabaq-02 қалтасын жасаңыз, редакторда ашыңыз (File → Open Folder) және терминалда орындаңыз:

go mod init sabaq02

Енді сол қалтада main.go файлын жасап, ішіне мына бағдарламаны салыңыз:

package main

import (
	"log"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("Сәлем!"))
	})
	log.Fatal(http.ListenAndServe(":8080", nil))
}

Терминалда сол қалтаға өтіп, іске қосыңыз:

go run .

Меңзер қатып қалады, жаңа жол шықпайды. Солай болуы керек: бағдарлама жұмыс істеп, күтіп тұр. Браузерді ашып, localhost:8080 теріңіз.

Экранда «Сәлем!». Бұл сіздің бағдарламаңыз жауап берді.

Тоқтату үшін терминалда Ctrl+C.

Шықпай қалса. Енгізу жолы бірден қайтып келсе, ал терминалда address already in use жазылса — 8080 портын басқа бағдарлама алып отыр. Кодта 8080-ді 8081-ге өзгертіп, localhost:8081 ашыңыз. command not found: go жазылса — терминал Go-ны көрмей тұр: оны жауып, қайта ашыңыз, көмектеспесе өткен сабақтағы go version тексерісіне қайтыңыз. Windows желіге қатынау туралы сұраса — жеке желілер үшін рұқсат етіңіз; сол жағында мекенжайы жоқ :8080 порты «барлық желілік интерфейс» дегенді білдіреді, яғни үй желісінде серверді телефоннан да көреді. Үйреніп жүргенде бұл ыңғайлы; тек өз машинаңызбен шектелу үшін 127.0.0.1:8080 деп жазады.

Талдау

package main және func main

package main дегені: бұл кітапхана емес, іске қосуға болатын бағдарлама. func main — іске қосу басталатын жер. Бағдарламаға дәл біреуі, Go оны атымен табады.

Әзірге мұны міндетті жақтау деп қабылдаңыз. Пакеттерге пакеттер мен модульдер туралы сабақта, олар көбейгенде ораламыз.

import “net/http”

Вебке керектің бәрі Go-ның өзінде бар — бөлек орнататын ештеңе жоқ. net/http клиент ретінде сұрай да, сервер ретінде жауап бере де алады. Біз екінші жартысын алдық.

http.HandleFunc: нені жауап беру

Бірінші аргумент — жол, екіншісі — сол жолда не істеу. Біз: "/" жолында мына функцияны орында, дедік.

Байқаңыз: функция шақырудың дәл ішінде, атаусыз жазылған. Go-да олай жазуға болады, қысқа өңдеушілер үшін бұл әдеттегі жағдай.

Елестетіп көріңіз. Есікке ілінген тапсырмалар тізімі: «анықтамаға келсе — мынаны беріңіз». Әзірге ешкім келмегенде тізім жай ғана ілініп тұрады.

w мен r: жауап пен сұраныс

Өңдеушінің екі аргументі — өткен сабақтағы сол екі жақ.

r — сұраныс: оқырман нені сұрады, қай әдіспен, қай жолмен, қандай тақырыптармен. Қазір оны қозғамаймыз.

w — жауап жазылатын жер. w.Write денені жібереді. Күй кодын біз көрсеткен жоқпыз, оны Go өзі 200 деп қойды — себебі бұл ең жиі кездесетін жағдай.

[]byte("Сәлем!") дегенді әзірге «осы жол байттар жиыны түрінде» деп оқыңыз. Неге олай екені жолдар мен руналар туралы сабақта түсінікті болады.

Елестетіп көріңіз. Үстелдегі екі науа. Солға пошташы келген хатты салады — бұл r, оны сіз оқисыз. Оң жағы бос, оған сіз жауапты саласыз — бұл w. Науаларды шатастыруға болмайды: сол жақтан жауап жіберілмейді.

http.ListenAndServe: қайда тыңдау

":8080" — порт, өткен сабақтағы сол пәтер нөмірі. Екінші аргумент nil дегені «HandleFunc арқылы тіркеген өңдеушілерімді ал». Маршруттар туралы сабақта оның орнына өзіміздікін қойып, айырмашылығын көреміз.

Терминалдың қатып қалуының себебі осы жол: бағдарлама аяқталған жоқ, ол тыңдап тұр.

Сыртындағы log.Fatal — тыңдау сәтсіз болған жағдайға: порт бос емес, құқық жетпейді. Сонда бағдарлама үнсіз өлмей, себебін жазып шығады. Осы қаптамасыз жаңадан бастаған адамның ең жиі сәтсіздігі «жай ғана ештеңе болмады» болып көрінеді.

Елестетіп көріңіз. Қабылдау терезесіне отырып, оны ашу. Отырғанда — келушілерді қабылдайсыз. Тұрып кетсеңіз — терезе жабық, қаққанның пайдасы жоқ.

Неге 8080, 80 емес

80 порты — HTTP үшін стандартты, бірақ өз машинаңызда оны әкімші құқығынсыз алу әдетте мүмкін емес. IP — үй, порт — пәтер десек, осы үйдегі 80 бен 443 — қызметтік пәтерлер: басқарушы компанияның кілтінсіз оларға кіре алмайсыз. 8080 бос, әрі әзірлеу үшін одан кем емес. Нағыз серверде, домен мен HTTPS туралы сабақта, 80 бен 443-ті сіздің бағдарламаңыз емес, оның алдындағы Caddy алады.

Бетті ашқанда не болды

Браузер localhost-тың 8080 портына GET / жіберді. Сіздің бағдарламаңыз сұранысты қабылдап, / үшін өңдеушіні тауып, орындады да, 200 мен денені қайтарды. Интернет қалай жұмыс істейтіні туралы сабақта талдаған дәл сол алмасу — тек бұл жолы сервер сіз болдыңыз.

Сабақ картасы

Сабақ картасы: нені жауап беру, қайда тыңдау, браузер

Өз сөзіңізбен айтыңыз

Қарамай, дауыстап немесе қағазға жазып жауап беріңіз. Жауаптары — сабақтың соңында.

  1. go run кейін терминал неге «қатып қалды» және бұл неге дұрыс?
  2. HandleFunc не істейді, ListenAndServe не істейді? Екеуі неге де қажет?
  3. Кодта тек "/" жолы тіркелген. Бағдарлама localhost:8080/about сұрағанда не жауап береді?

Тапсырма

Міндетті. Жауап мәтінін өз атыңызға ауыстырыңыз. Бағдарламаны тоқтатып, қайта іске қосып, бетті жаңартыңыз. Болды.

Қалауыңызша.

  • Екінші мекенжай қосыңыз: жолы "/about" болатын тағы бір http.HandleFunc пен басқа мәтін.
  • Өз жауабыңызға өткен сабақтың көзімен қараңыз: curl -i localhost:8080. Күй коды мен content-type тауып алыңыз. Жазбасаңыз да, content-type қайдан шықты?
  • Портты 3000 етіп ауыстырыңыз да, 8080-де енді ешкім жауап бермейтініне көз жеткізіңіз.

Блогта қайда тұрады

Осы жолдар — блогыңыздың қаңқасы. Ол әлі өзгереді: серверде өз бағыттауышы, таймауттар мен дұрыс аяқтау пайда болады. Бірақ пішіні сол күйінде қалады, қалғанының бәрі соған ілінеді: бағыттар туралы сабақта жалғыз "/" жолы ондаған мекенжайға айналады, үлгілер туралы сабақта жауап нағыз HTML бетке айналады, ал CRUD туралы сабақта мәтін кодтан емес, дерекқордан келеді.

Өз блогыңызды жинаңыз. Жеке бағдарламалар тілді үйретеді, ал блог солардан өседі. Осы сабақтан кейінгі блогтың күйі курс репозиторийінде — step-1. Алдымен өзіңіз жазыңыз, содан кейін салыстырыңыз: жұмыстан кейінгі салыстыру үйретеді, жұмыстың орнына салыстыру — жоқ.

Жауаптар

Жауаптарды көрсету
  1. Себебі ListenAndServe басқаруды қайтармайды: бағдарлама портты тыңдап, сұраныс күтеді. Ол бірден аяқталса, жауап беретін ешкім қалмас еді. Бұл қатып қалу емес, жұмыс.
  2. HandleFunc тек қана «мына жолда мынаны жауап бер» дегенді есте сақтайды; өздігінен ол ештеңе тыңдамайды. ListenAndServe портты ашып, сұраныс қабылдай бастайды, бірақ тіркелген өңдеушілер болмаса, оның жауап беретіні болмас еді. Бірінсіз екіншісі пайдасыз.
  3. Ол да «Сәлем!». Go-дағы "/" жолы «тек басты бет» емес, «дәлірек ереже табылмағанның бәрі» дегенді білдіреді. /about жауабы да, күткен жеріңізде 404 болмауы да содан.

Дереккөздер

Мәтінде қате не теру қатесі кездессе, бізге айтыңыз

Тапсырманы тексеру

Алдымен VS Code-та шешіп, іске қосыңыз — редактор қатені сол жерде көрсетеді. Дайын шешімді осында қойыңыз. Тексеретін — модель: ол қатені атап көрсетеді, бірақ дайын жауапты бермейді.

Тексеру үшін кіру керек. Кіру

Пікірлер (0)

Әзірге пікір жоқ. Бірінші болыңыз.