หลังจากที่ศึกษา 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
โดยผลการทำงานจะเป็นดังรูป

Screen Shot 2557-04-28 at 2.05.02 PM

โดย 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>
{{.}}

ผลการทำงานเป็นดังรูป

Screen Shot 2557-04-28 at 11.52.33 AM

ถ้าใส่ค่าว่างเข้าไป จะแสดงดังรูป

Screen Shot 2557-04-28 at 2.05.02 PM

เท่านี้ก็พอที่จะสร้าง 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 มันทำได้อย่างไรต่อไป

Tags: