มาใช้ Gin Framework บน Go กัน

Gin เป็น Framework ที่ไว้ทำ httprouter อารมณ์ก็จะคล้ายๆ express ที่ใช้ใน nodejs ซึ่งความเร็วของมันเนี่ยเขาบอกความเร็วกว่า40เท่าแต่ผมไม่รู้เขาเอาเทียบกับอะไรนะ 5555 ซึ่งในบทความนี้ผมจะมาใช้ Gin ทำ router สำหรับทำ api booking โดยจะมีทั้ง GET POST โดยจะใช้ mongodb มาเป็นฐานข้อมูล สามารถติดตั้งได้ในเครื่องเราเลยจาก https://www.mongodb.com/try/download/community

สิ่งที่ต้องเตรียม
- ลง golang ให้พร้อม
- ผมใช้ VSCode ในการเขียน Code ถ้าใครสดวกอย่างอื่นไม่ว่ากัน
- มีความรู้เรื่อง mongodb หรือหลักการของ nosql
- เตรียม postman ไว้สำหรับทดสอบ API ให้พร้อม
- เตรียมสมองให้ปลอดโปร่งแล้วมาลุยกันเลยดีกว่าครับ 5555

mkdir example
cd example
mkdir booking
gin mod init booking

เรามาสร้าง folder และทำการติดตั้ง project ให้เรียบร้อย

go get -u github.com/gin-gonic/gin

หลังจากนั้นทำการ install gin ลงใน project booking และสร้าง file main.go ลงไป และนำ code ตามดานล่างไปแปะ

จะเห็นว่าผมใช้ net/http มาช่วยทำ http server จากนั้นทำการ run go ตามปกติ

go run main.go

จากนั้นเราลองไปยิง api ก็จะได้ response ออกมาตาม code คือ message : pong

จากนั้นเราจะทำแบบ API แบบ Advance ขึ้นมาอีกโดยผมจะอธิบายเป็นส่วนๆว่ามันคืออะไรแต่ผมจะสร้าง code ทั้งหมดมาแปะไว้ก่อน

โอ้วจาก code ข้างต้นทำไมจากสั้นๆถึงยาวจัง 5555 ผมจะอธิบายเป็นส่วนๆไปนะครับจะเล่าคร่าวๆก่อนผม หลังจากเอา code นี้ไปแทนที่ใน main.go ก็ทำ run คำสั่งด้านล่างเพื่อทำการ install lib ทั้งหมดก่อน

go mod tidy

มาอธิบายส่วนแรกกันก่อนเลยครับติดตั้ง mongodb บน local ให้เรียบร้อยหรือใครมี server จริงก็เอามาใช้ได้เลย โหลดได้จาก link นี้ https://www.mongodb.com/try/download/community

อันนี้จะเป็น lib หลักๆเลยสำหรับ mongo ดูเพิ่มเติมได้ที่ link https://www.mongodb.com/docs/drivers/go/current/fundamentals/connection/#std-label-golang-connection-guide

เป็น function สำหรับต่อ mongo db โดยตอนแรกก็เป็น config ปกติว่าให้เชื่อมต่อได้เท่าไหร่ภายในเวลาที่กำหนด และเราจะทำ NewClient ไว้สำหรับทำการเชื่อมต่อแต่ยังไม่ได้เชื่อมนะเหมือนเตรียมๆไว้ จากนั้นใช้ context มาช่วยทำ multitask และจะทำ cliCh และ errCh เพื่อมาดักว่าได้ value ตาม type นั้นไหม และ ก็ทำการ connect และเราก็จะทำการ ping ว่ามันได้นะ ถ้าได้เชื่อมต่อ database ได้ปกติ ถ้าไม่ได้ไม่ได้เพราะอะไร ถ้า timeout ก็ขึ้น time out

*จะเห็นว่า uri,pool,timeout ผมจะ fix ไว้ หรืออื่นๆที่ fix ไว้ จริงๆเราต้องทำ config ไว้แล้วใช้ viper lib มาดึงแต่บทความนี้ผมจะยังไม่ไปพูดถึงส่วนนั้น

เป็น function ที่ผมมาทำ http router หรือ api นั้นแหละครับ โดยตอนแรกก็จะทำ logger โดยใช้ zap เอามาไว้เช็คความพร้อมต่างๆ หลังจากนั้นก็เช็คว่า database เชื่อมได้ปกตินะ จากนั้นก็ go func ที่ทำงานแยกออกไปดัก chan quitDepency ถ้ามี การกด ctrl+c ก็จะทำการ ปิด service ต่างๆของเรา ส่วน app.use ก็เอา cors มาช่วยเผื่อให้ภายนอกเข้ามาหาเราได้ และ set ค่าต่างๆ จากนั้น ก็ทำ service ที่มี path /ping ที่รับค่าเป็น get จากนั้น return app ทั้งก้อนที่เราเซ็ทออกไป

จากนั้นก็ทำ http server ปกติโดยผมใช้ Port 8080 และก็ไปเรียกใช้ func ginEngine() เพื่อทำ httprouter ปกติ จากนั้นก็ดัก signal ของ chan ที่เราตั้งค่าไว้ โดยดัก os.Interrupt แหละว่ามีการกด ctrl+c หมายถึงหยุดการทำงานโปรแกรมก็จะมีการทำ multitask และทำการ log มาลองมารันให้เห็นภาพ

จะได้ดังภาพและถ้าเราก็มาลองยิง postman เหมือนเดิมได้ response มาเหมือนเดิม

หลังจากนั้นลองมาปิดโปรแกรม

ก็จะ log ตามที่เราดักไว้

มากันต่อในเรื่องการทำ api ที่เชื่อมกับ database โดยจะทำการ booking มาดู code ทั้งหมดกันแล้วจะอธิบายเป็นส่วนๆครับ

*จริงๆ code มันจะไม่ยาวขนาดนี้นะครับเวลาทำจริงๆควรแยกให้เป็นสัดส่วนแต่อันนี้ผมเอาง่ายในการเขียนบทความไม่งั้นจะมีอธิบายส่วนของ package หรืออะไรต่างๆมากกว่านี้ 5555 แต่ทำงานได้ =

จากข้างต้นผมจะกำหนด struct ต่างๆให้ booking ทำไมถึงมี 2 struct ผมจะให้ BookingMongoModel เป็นการ create และจะใช้ BookingMongoIDModel เพื่อ
get db และทำสร้าง MongoDB struct ให้เรียกใช้งานง่ายๆเดียวไปตัว repository function เก็บฐานข้อมูลต่างๆ

ผมสร้างมา 3 fucntion

func CreateBooking ตามตัวเลยคือ insert ข้อมูลลง collection ที่ชื่อว่า booking

func FindAllBooking ก็คือ get คนเช่าหนังสือทั้งหมด

func FindByID ค้นห้าหนังสือด้วย object id คือที่ mongo มันสร้างให้เราอัตโนมัติแหละครับ

ผมจะมีการเพิ่ม code ไปใน ginEngine() เพื่อสร้าง mongoDB เอาไปใช้ต่อง่ายคือยึดโครงสร้าง struct ด้านบน โดยจะส่ง mongoclient,logger เข้าไป ซึ่งจะเห็นว่า func ที่จัดการ db เราจะ log ทุกครั้งที่มีการเรียกใช้

และจะมีการเพิ่ม path มา 3 path

POST /booking ตัวนี้จะเป็นการส้รางโดยรับค่าเข้ามาเป็น json ซึ่งรับค่าได้ง่ายๆโดยอ้างอิงจาก struct ได้เลย var req BookingMongoModel และก็ทำการ by ค่าเข้าไปโดยใช้ SholdBindJSON และทำการส่งค่าเข้าไป CreateBooking

แล้วทำการยิง api ไปสร้างได้ตามภาพเลยโดย json ผมจะกำหนดไว้ 2 ชุดตามภาพด้านบน

แล้วเราจะลองมาทำการ get all กัน

พอยิง postman ไปก็จะได้คนที่ booking ทั้งหมดออกมาซึ่งจะเห็นว่าจะมี return ออกมาด้วยซึ่งตามที่ผมบอกไปตอนตั้นผมส้ราง struct มา 2 อัน ที่ใช้สร้างและ get
จะเห็น _id มันออกมาเราสามารถเอา _id ที่ได้มาไปใช้ใน api ต่อไป

ผมก็เอาไอดีมาต่อท้ายง่ายๆแบบนี้ได้เลยและได้ response ออกมาตามภาพด้านบน

ผมจะมาอธิบายตัว response ซักหน่อย

ซึ่งผมจะสร้าง struct สำหรับการ และ function สำหรับการ return response

โดยผมจะได้เรียกใช้ถ้า error กับ ถ้ามัน ok ซึ่งตรงนี้ไป custom ได้แล้วแต่คนชอบว่าจะให้ออกมาในรูปแบบไหน

ซึ่งที่เรายิงทั้งหมดก็จะถูก log ออกมาหมดตามที่เราเอาไปวางจัดต่างๆ

มาต่อกันอีกหน่อยถ้าเกิดใครอยาก auto refresh เวลามี code เปลี่ยนแปลงโดยมันมีหลายวิธีมากแต่ผมจะใช้ nodemon เข้ามาช่วย

ทำการติดตั้ง nodemon ให้เรียบร้อย

npm install -g nodemon

หลังจากนั้นก็ใช้ได้เลย

nodemon --exec go run main.go

เท่านี้เราก็ไม่ต้องไปเปิดปิดใหม่เพื่อ run ทุกครั้งแล้ว

ก็จบไปแล้วสำหรับการทำ golang และ การทำ mongo db ใน golang รอบหน้ามาพูดถึงตัว viper กับการเอาขึ้น aws lambda กันครับไม่แน่ใจเหมือนกันว่าจะรวมเล่มกันเลยหรือว่าแยกดีดูอันนี้แล้วมันยาวๆ 555555

บทความสำหรับปูพื้นฐาน

( CR. ธำรงค์ ไชยวงค์ )

--

--

No responses yet