มาสร้าง RESTful Web Service ด้วย Echo (Go web framework)
วันก่อนไปถามในกลุ่ม 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 โหวตว่าใช้กันมากที่สุด