มาสร้าง RESTful Web Service ด้วย Echo (Go web framework)

Phayao Boonon
3 min readJun 18, 2019

--

Photo by Denisse Leon on Unsplash

วันก่อนไปถามในกลุ่ม Golang Thailand ว่าใช้ web framework ของ Go ตัวไหนกันบ้าง คนส่วนใหญ่โหวตให้ Echo framework มาวินเป็นอันดับ 1 เลยทีเดียว โดยส่วนตัวผมก็ยังไม่เคยใช้ framework นี้มาก่อนเลย เคยใช้แต่ gorilla/mux ในบทความนี้เลย อยากจะลองใช้ Echo framework มาสร้าง RESTful Web Service แบบง่ายๆ ดู

Echo?

Echo เป็น web framework สำหรับภาษา Go พัฒนาขึ้นโดย LabStack ที่เครมว่า มีประสิทธิภาพสูง (High performance), ขยายเพิ่มเติมได้ (Extensible), มีความเรียบง่าย (Minimalist) โดยมี feature หลักๆ ดังนี้

  • ปรับแต่ง HTTP router ในระดับสูงด้วย Zero dynamic memory allocation ซึ่งเป็นการจัดลำดับความสำคัญของ request ที่ฉลาด (Smarty prioritize routes)
  • สร้าง RESTful API ที่ robust และ scalable และจัดเป็นกลุ่มได้ง่าย
  • ติดตั้ง TLS certificate จาก Let’s Encrypt ให้อัตโนมัติ
  • รองรับ HTTP/2 ที่ปรับปรุงความเร็วและ user experience ที่ดีกว่า
  • มี built-in middleware หลากหลายให้ใช้ หรือสร้างใหม่ได้ และ middleware สามารถตั้งค่าในระดับ root, group หรือ route ได้
  • มี data binding สำหรับ HTTP request ที่รองรับ JSON, XML หรือ form-data
  • API สามารถส่ง HTTP response ได้หลากหลาย ทั้ง JSON, XML, HTML, file, attachment, inline, stream หรือ blob.
  • ทำ template rendering ได้ด้วย template engine ที่หลากหลาย
  • ปรับแต่งการจัดการ HTTP error กลาง และปรับขยาย API ได้ง่าย

Install

ในบทความนี้จะใช้วิธีการติดตั้ง Go package แบบ go get ด้วยคำสั่ง

go get -u github.com/labstack/echo/...

Create Project

หลังจากติดตั้งเรียบร้อยแล้ว ก็ไปที่ $GOPATH แล้วสร้าง project folder ตามต้องการ ตัวอย่างเช่นของผมจะอยู่ใน path ของ /github.com/iphayao

mkdir $GOPATH/src/github.com/iphayao/echo-restful-api

สร้างไฟล์ server.go และ import github.com/labstack/echo เข้ามาในไฟล์ แล้ว

  • สร้าง main() function โดยใช้ e := echo.New() เพื่อสร้าง instance ของ Echo ขึ้นมาใช้งาน
  • เรียก method GET เพื่อจัดการกับ HTTP GET method ด้วย root path "/"
  • พร้อมทั้งกำหนด handle function ที่จัดการกับ HTTP request ซึ่งก็นเป็นการ response ข้อความ “Hello, World!” ด้วย HTTP status 200:OK
  • สุดท้าย start server ด้วย e.Start(":8080") บน port 8080

รัน Web Server ด้วยคำสั่ง go run server.go จะแสดง text logo ของ Echo และบอกว่าทำงานบน port อะไร

   ____    __
/ __/___/ / ___
/ _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.1.5
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
O\
⇨ http server started on [::]:8080

เมื่อลองใช้ POSTMAN ยิงมาที่ http://localhost:8080 ก็จะได้ข้อความ

Hello, World!

ก็เป็นอันว่าใช้งาน Eecho เบื้องต้นได้แล้ว ต่อไปจะกำหนด endpoint สำหรับ CRUD operation และสร้าง function จัดการกับ HTTP request โดยที่จะติดต่อกับ MySQL database ด้วย gorm framework ซึ่งเป็น ORM สำหรับ Go

Routing

เพิ่มเติม route เพื่อจัดการกับ HTTP method ต่างๆ ของ CRUD operation สำหรับ resource customers โดยกำหนด handler function มาจัดการในแต่ละ endpoint

ในส่วนของ database ใช้ GORM เป็น ORM library เพื่อจัดการ data model ให้ โดยสร้าง CustomerHandler struct ขึ้นมาและกำหนด field เป็น DB *gorm.DB สำหรับใช้ติดต่อกับ database และ สร้าง Initialize method สำหรับ open database connection และ auto migrate Customer data model

โดยที่ Customer data model จะกำหนดให้ field Id เป็น primary key

Handler

สร้าง handler function ของแต่ละ CRUD operation จะเห็นได้ว่า สามารถ get path parameter ด้วย method Param ซึ่งง่ายต่อการดึงค่า

สามารถ binding data model กับ HTTP request body ได้ด้วย method Bind ทำให้สะดวกในการดึงค่า body

สามารถ response ค่าได้ทั้งแบบ JSON ซึ่งจะ serialize data model เป็น JSON หรือจะ No Content ก็ได้ ซึ่ง Echo รองรับหลากหลายรูปแบบ

เมื่อใช้ POSTMAN ทดสอบ RESTful Web Service ที่สร้างขึ้นด้วย Echo นี้ ก็จะเห็นได้ว่าสามารถทำงานได้ตาม CRUD operation (จะไม่ได้อธิบายในการทดสอบนี้)

สรุป

จากการที่ได้ลองใช้ Echo web framework ในการสร้าง RESTful Web Service นี้ก็เป็นอย่างที่ตัว Echo ได้เครมไว้ คือสามารถ develop API ได้ง่าย กว่าที่เคยได้ลองใช้ Go สร้าง RESTful API มา สบกับที่สมาชิกในกลุ่ม Golang Thailand โหวตว่าใช้กันมากที่สุด

--

--

Phayao Boonon
Phayao Boonon

Written by Phayao Boonon

Software Engineer 👨🏻‍💻 Stay Hungry Stay Foolish

No responses yet