[Golang] HTTP request and router

Visarut Junsone
Lazy-Dev
Published in
2 min readJan 6, 2019

ในวันนี้เราจะมาพูดในเรื่องของการสร้าง HTTP request และ router กัน โดยบล็อคนี้จะเป็นตัวต่อยอดไปหาการสร้าง API ในบล็อคต่อไป เนื่องจากเกรงว่ามันจะยาวไป ขี้เกียจเขียน ฮ่าๆๆๆๆ เอาละ เรามาเริ่มกันเลยครับผม

เพื่อให้เกิดความง่ายในการอธิบายหัวข้อนี้ เลยจะข้อใช้ package ในการสร้าง HTTP request และ router แทนที่จะมานั่งเขียนเอง (ยากไปขี้เกียจ เอาแค่พอเข้าใจคอนเซปละกัน ฮ่าๆๆๆ) โดนผู้เขียน เลือกใช้ fasthttp และ fasthttp-routing

Fast HTTP https://github.com/valyala/fasthttp

fasthttp-routing https://github.com/qiangxue/fasthttp-routing#fasthttp-routing

ก่อนอื่นเราก็ต้องเริ่มกันที่การ import package ด้วยคำสั่ง go get

go get "github.com/valyala/fasthttp"go get "github.com/qiangxue/fasthttp-routing"

เวลาเรียกใช้ก็ง่าย ๆ ครับ import แล้วตามด้วยชื่อเหมือนเดิม

import (    "github.com/qiangxue/fasthttp-routing"    "github.com/valyala/fasthttp")

เท่านี้เราก็สามารถเรียกใช้ตัวช่วยสร้าง http request (fasthttp) และ ตัวช่วยสร้าง routing (fasthttp-routing) ง่ายมาก ก.ล้านตัว

และก็ทำการยกการเขียนตัวอย่างมาจาก document ของ fasthttp-routing จะได้แบบนี้

package mainimport (     "fmt"     routing "github.com/qiangxue/fasthttp-routing"     "github.com/valyala/fasthttp")func main() {     router := routing.New()     router.Get("/", func(c *routing.Context) error {          fmt.Fprintf(c, "Hello, world!")             return nil     })     panic(fasthttp.ListenAndServe(":8080", router.HandleRequest))}

แต่ก่อนเราจะมา run code เราต้องมาอธิบายกันก่อน ว่า อะไรทำอะไร เพื่อเป็นการเสริมสร้าง เทคนิคและความเข้าใจ เริ่มตรง import กันก่อนเลย

Import

Package “fmt” เป็น package เอาไว้สำหรับใช้จัดการ การจัดรูปแบบ input output ข้อความต่าง ๆ เช่น printf println อื่น ๆ อีกมากมาย ดูได้ที่ https://golang.org/pkg/fmt/

Package “github.com/qiangxue/fasthttp-routing” เป็น package เอาไว้สำหรับจัดการ route path หรือ routing จะเห็นได้ว่าใน code snippet ผมโดยมีการกำหนดชื่ออยู่ด้านหน้า การทำแบบนี้ เป็นการกำหนด Alias ให้ package เพื่อที่เราจะได้เรียกผ่านชื่อนั้นได้ เช่น routing.New() เป็นต้น

routing "github.com/qiangxue/fasthttp-routing"

Package “github.com/valyala/fasthttp” เป็น package เอาไว้สำหรับจัดการเรื่อง HTTP request การจัดการ request

Main

ต่อไปเป็นส่วนของ function main ซึ่งจะเป็นส่วนที่โปรแกรมจะเรียกใช้ก่อนเมื่อทำคำสั่ง run file (go run main.go) **** เกร็ดเล็กน้อย การสร้าง function ของ Go ทำได้โดยการใช้คำว่า func ตามด้วยชื่อ เช่น func thisIsFunction() {}

router := routing.New()

routing.New() เป็นฟังก์ชั่น เพื่อสร้าง Router Object ใหม่ สำหรับทำการจัดการการ routing และ การส่ง request เข้าไปตัวจัดการอย่างเหมาะสม

router.Get("/", func(c *routing.Context) error {      fmt.Fprintf(c, "Hello, world!")      return nil})

router.Get(Path, Handler) คำสั่ง get เป็นคำสั่งเพื่อเพิ่มเส้นทาง Method GET ไปยัง router ด้วยชื่อเส้นทาง (Path) และ ตัวจัดการเส้นทางที่กำหนด (Handler) ในกรณีนี้ Path คือ “/” และ Handler คือ ฟังก์ชั่น หนึ่งในตัวอย่างนี้คือฟังก์ชั่น แสดง “Hello, world!”

เมื่อมีคนเรียกเข้ามาที่ localhost:8080 ด้วย method GET ก็จะได้ “Hello, world!” กลับไป

panic(fasthttp.ListenAndServe(":8080", router.HandleRequest))

บรรทัดนี้ต้องแบ่งอธิบายเป็นส่วนๆ ไป

router.HandleRequest เป็นส่วนที่เอาไว้จัดการ HTTP request จัดการว่า Context ที่เข้ามาเป็นอะไร เช่น Method GET,POST หรือ Path ชื่ออะไร

fasthttp.ListenAndServe(Address, Handler) ทำหน้าที่ รับ หรือ ส่ง HTTP request จาก Address ที่กำหนด ในที่นี้เรากำหนด “:8080”

panic ฟังก์ชั่นนี้เป็นฟังก์ชั่นพื้นฐานของ go โดยจะเอาไว้ใช้ทำการตรวจจับ error ที่เกิดขึ้น เป็น case ที่ไม่ควรเกิดขึ้น หรือ เราเขียน handle ไว้ ไม่ครอบคลุม เมื่อ error หลุดมาถึง panic ก็จะทำการ print ข้อความ error และ goroutine traces

ลอง run กันเถอะ

go run main.go

ทดสอบเรียกด้วยหน้า Web ที่ Address localhost:8080 แสดงคำว่า Hello, world!

จบแล้วครับ กับการสร้าง HTTP Request และ routing แบบง่ายมาก ก.ไก่ ล้านตัว ซึ่งสามารถนำตรงนี้ไปดัดแปลงสร้าง API ของตัวเองได้เลยครับ

--

--

Visarut Junsone
Lazy-Dev

I’m Full-Stack Developer. ReactJS Golang C# Javascript C++ PHP and learning a lot more. Not lazy as it name. “Lazy-Dev”