หลังจากที่ศึกษา Go มาพอสมควร
ลองมาเรียนรู้การทำมาหากินกันบ้าง
ด้วยการพัฒนาระบบ Web application อย่างง่ายดีกว่า
โดย library ที่ใช้ทางทีมพัฒนา Go ก็ได้เตรียมไว้ให้แล้ว
อยู่ใน net/http และ html/template
เริ่มด้วยของง่ายๆ จาก Effective Go ในเรื่อง Web Server
ตัวอย่างที่ให้มานั้นคือการสร้าง Web server
เพื่อใช้งาน http://chart.apis.google.com/ สำหรับการแสดงข้อมูล
ให้อยู่ในรูปแบบที่สวยงามเช่น กราฟแท่งและกราฟเส้น เป็นต้น
โดยจากตัวอย่าง จะสร้าง QR Code ขึ้นมาของข้อความสั้นๆ
การใช้งานก็ต้องเข้าผ่าน url และ port ที่กำหนด คือ localhost:1718
โดยผลการทำงานจะเป็นดังรูป
โดย code ที่สร้างขึ้นมาเป็นดังนี้
package main import ( "flag" "html/template" "log" "net/http" ) var addr = flag.String("addr", ":1718", "http service address") // Q=17, R=18 var templ = template.Must(template.New("qr").Parse(templateStr)) func main() { flag.Parse() http.Handle("/", http.HandlerFunc(QR)) err := http.ListenAndServe(*addr, nil) if err != nil { log.Fatal("ListenAndServe:", err) } } func QR(w http.ResponseWriter, req *http.Request) { templ.Execute(w, req.FormValue("s")) } const templateStr = ` <html> <head> <title>QR Link Generator</title> </head> <body> {{if .}} <img src="http://chart.apis.google.com/chart?chs=300x300&cht=qr&choe=UTF-8&chl={{.}}" /> <br> {{.}} <br> <br> {{end}} <form action="/" name=f method="GET"><input maxLength=1024 size=70 name=s value="" title="Text to QR Encode"><input type=submit value="Show QR" name=qr> </form> </body> </html> `
คำอธิบาย
1. ส่วนแรกคือ package ที่ใช้ ประกอบไปด้วย flag, net/http, html/template และ log
flag คืออะไรล่ะ
คือ package สำหรับการอ่านข้อมูลจาก command line
จากตัวอย่างพบว่ามีการใช้งาน
เริ่มจากประกาศตัวแปรและกำหนดค่า
var addr = flag.String("addr", ":1718", "http service address”)
ทำการอ่านค่าด้วยคำสั่ง
flag.Parse()
ผลลัพธ์ที่ได้
fmt.Println("Address : ", *addr)
แสดงค่า :1718
ต่อมาเริ่มใช้งาน function ต่างๆ ใน net/http
ทำการดัก request ที่เข้ามายัง / ให้เข้าทำงานที่ function QR
และเปิด Listener คอยดักฟัง และตรวจสอบ error ดังนี้
http.Handle("/", http.HandlerFunc(QR)) err := http.ListenAndServe(*addr, nil) if err != nil { log.Fatal("ListenAndServe:", err) }
ดังนั้นถ้าเข้าใช้งานผ่าน http://localhost:1718 จะเข้าทำงานที่
function QR ดังนี้
func QR(w http.ResponseWriter, req *http.Request) { templ.Execute(w, req.FormValue("s")) }
ใน function QR ทำการรับ request มาและจะส่ง response กลับไปยังผู้ร้องขอ
โดยใน function นี้ทำการเรียกใช้ function จาก package html/template
โดย package html/template
สำหรับกำหนด template เพื่อสร้าง html ออกไป
ซึ่งปลอดภัยจากการ injection ในกรณีต่างๆ อย่างแน่นอน
และ function การทำงานจะเหมือนกับ interface ที่อยุ่ใน package text/template เลย
โดยใน template จะส่งค่าจาก req.FormValue(“s”) ไปใส่ใน template
ถ้ามีข้อมูลจะส่งค่าไปยัง template ดังนี้
{{if .}} <img src="http://chart.apis.google.com/chart?chs=300x300&cht=qr&choe=UTF-8&chl={{.}}" /> <br> {{.}}
ผลการทำงานเป็นดังรูป
ถ้าใส่ค่าว่างเข้าไป จะแสดงดังรูป
เท่านี้ก็พอที่จะสร้าง Web server ด้วย Go ได้แล้ว
จะสังเกตได้ว่า สามารถสร้างได้เพียงไม่กี่บรรทัดเท่านั้น ดังนี้
package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:]) } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":1718", nil) }
ต่อไปเรามาดูกันว่าจะเอาพวก JavaScript framework มาใช้
กับการพัฒนา REST APIs ด้วย Go มันทำได้อย่างไรต่อไป