ภาษา Go ตอน 8 เขียน RestFul Api ด้วย GO
จากตอนที่แล้ว เราได้เรียนรู้เกี่ยวกับการเขียน Unit Testing ด้วยภาษา Go เป็นที่เรียบร้อยแล้ว
และประเด็นคือเราเขียนแบบ Test Driven Development (TDD) ด้วยนะ เกี่ยวกับโปรแกรม FizzBuzz ใครยังไม่อ่านสามารถอ่านได้ที่ Link ข้างล่างเลย
และในวันนี้เราจะมาทำความรู้จักกับการเขียน RestFul Api ด้วยภาษา GO ง่ายๆ กันครับ โดยผม คาดว่าเพื่อนๆทุกคนที่มาถึงตอนนี้น่าจะติดตั้ง ภาษา Go ลงบนเครื่องแล้ว
แต่ถ้าเพื่อนๆ คนไหนยังไม่ได้ติดตั้งสามารถ กดได้ที่ Link ข้างล่างนี้เลยครับ
และการเขียน RestFul Api ที่จะเรียนรู้ไปด้วยกันวันนี้ ต้องมีพื้นฐานเรื่องเหล่านี้มาสักเล็กน้อย คือเรื่องของ Syntax, Structโดยเพื่อนๆ สามารถปูพื้นได้จาก Link ข้างล่างเหล่านี้ตามลำดับครับ
เมื่อฐานตอนนี้แน่นกันแล้ว เราไปลุยกันเลย
Step 1 เริ่มต้นสร้าง Project
ให้เพื่อนๆ เข้าไปอยู่ที่ Path นี้ของตัวเองก่อนนะครับโดยใช้คำสั่ง
cd go/src/github.com/{ชื่อ username github ของตัวเอง}
เมื่อเข้าไปอยู่ใน Path ดังกล่าวแล้วใช้คำสั่ง
pwd
ก็จะแสดง Path ที่เราต้องการแล้ว ได้ดังภาพนี้
ทีนี้เราใช้คำสั่ง mkdir ในการสร้าง Directory ชื่อว่า go-api ดังนี้
[สร้าง Directory ที่ Path /Users/chaiyarin/go/src/github.com/chaiyarin]mkdir go-api
พอสร้างเสร็จแล้วก็จะได้หน้าตาในลักษณะแบบนี้
Step 2 สร้างไฟล์ main.go ภายใต้ Directory go-api
สร้างไฟล์ main.go ภายใต้ Directory go-api โดยภายในไฟล์จะประกอบไปด้วย Source Code ดังนี้
[Filename: main.go]package mainimport (
"fmt"
)func main() {
fmt.Println("Create File Main.go Success")
}[ผลลัพธ์จากการ Run]Create File Main.go Success
เมื่อสร้างไฟล์ main.go ภายใต้ go-api แล้วลองใช้คำสั่งนี้เพื่อ Run ไฟล์ main.go
[คำสั่ง Run]go run main.go
ก็จะได้ผลลัพธ์ตามที่ได้บอกไว้ด้านบน
[ผลลัพธ์จากการ Run]Create File Main.go Success
Step 3 Import Package net-http ของภาษา Go เข้ามา
[Filename: main.go]package mainimport (
"fmt"
"net/http" // import package net-http เข้ามา
)func main() {
fmt.Println("Create File Main.go Success")
}
Step 4 สร้าง 2 Method สำหรับรับ Request ที่ยิงเข้ามาเพื่อขอข้อมูล ชื่อ handleRequest และ homePage
[สร้าง method ชื่อ handleRequest]func homePage(w http.ResponseWriter, r *http.Request) { // (1)
fmt.Fprint(w, "Welcome to the HomePage!") // (2)
}func handleRequest() { // (3)
http.HandleFunc("/", homePage) // (4)
http.ListenAndServe(":8080", nil) // (5)
}
อธิบาย Source Code
(1) method homePage รับ Parameter 2 ตัว คือ http.ResponseWriter และ http.Request
http.ResponseWriter คือ ค่าบางอย่างที่เราจะต้องการส่งออกกลับไปยัง Client
http.Request คือ ข้อมูล Request ที่ Client ส่งเข้ามาให้เรา
(2) ซึ่ง ณ ที่นี้ เราจะส่ง Welcome To the HomePage! ออกไป ในกรณี มี Request เรียกหน้า homePage เรา
(3) method handleRequest จะทำหน้าที่รับทุก Request ที่ Client ส่งผ่านมาเข้าสู่ Server เราและ จะแยกว่ามันจะไป Path ไหน
(4) http.HandleFunc คือ เมื่อมี Request เข้ามาแล้วมันจับคู่ได้ Path “/” มันจะส่ง Request ผ่านไปต่อที่ method homePage ให้ทำงานต่อทันที
(5) http.ListenAndServe รับ Parameter 2 ตัว คือ
- Port ที่เราต้องการให้ Request จาก Client ส่งเข้ามา ณ ที่นี้คือ Port 8080
- Option สำหรับเลือกใช้ตัว Handle Request ถ้าใส่เป็น nil มันจะใช้ DefaultServeMux ในการ Handle Request
พอสร้าง 2 method ดังกล่าวแล้วก็ถึงเวลาประกอบร่างเข้ากับไฟล์ main.go ก็จะได้ไฟล์ออกมาหน้าตาลักษณะแบบนี้
[Filename: main.go]package mainimport (
"fmt"
"net/http"
)func homePage(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Welcome to the HomePage!")
}func handleRequest() {
http.HandleFunc("/", homePage)
http.ListenAndServe(":8080", nil)
}func main() {
handleRequest() // ต้องนำ handleRequest มาใส่ใน main ด้วยนะครับ
}
หลังจากนั้นลองสั่ง run ด้วยคำสั่ง
[คำสั่ง Run]go run main.go
เมื่อสั่ง run แล้วจะไม่เกิดอะไรขึ้น ไม่ต้องตกใจ เราสามารถเข้าไปดูผลที่ผ่าน Browser ได้ โดยใส่ url เป็น
http://localhost:8080/
ถ้าถูกต้อง Browser จะแสดงผลดังนี้
เพื่อให้มันเจ๋งไปกว่านั้น เราลองมาทำ RestFulApi กัน ให้ Client ยิง Request เข้ามาและ Return เป็น Json กลับไปให้เลย ป่ะครับ ไปลุยกันต่อ
Step 5 ทำ RestFulApi และ Response เป็น Json กลับไป
หลังจากที่เราสามารถรับ Request จาก Client ได้แล้ว ต่อจากนี้เราจะมาทำให้มันสามารถ Response เป็น Json กลับไปได้กัน
โดยเริ่มจากให้เราไปเพิ่ม Path ใน method handleRequest กันก่อนให้ชื่อ Path ว่า getAddress แบบนี้
func handleRequest() {
http.HandleFunc("/", homePage)
http.HandleFunc("/getAddress", getAddressBookAll) // เพิ่มบรรทัดนี้
http.ListenAndServe(":8080", nil)
}
หลังจากนั้น คราวนี้ เราอยากให้รูปแบบข้อมูลเรา Response ออกไปแบบไหน เราก็ต้องไปสร้าง โครงสร้างข้อมูลเรียกว่า Struct แบบนี้
type addressBook struct {
Firstname string
Lastname string
Code int
Phone string
}
และต้องสร้างอีก 1 method ชื่อ getAddressBookAll ขึ้นมา เพื่อ Response ข้อมูล json ออกไปแบบนี้
func getAddressBookAll(w http.ResponseWriter, r *http.Request) {
addBook := addressBook{
Firstname: "Chaiyarin",
Lastname: "Niamsuwan",
Code: 1993,
Phone: "0870940955",
}
json.NewEncoder(w).Encode(addBook) // (1)
}
อธิบาย Code เล็กน้อย
(1) json.NewEncode ก่อนจะใช้ได้เราต้อง Import Package ที่ชื่อว่า “”encoding/json” มาก่อน มันจะทำการแปลง Struct ของเราให้ออกไปอยู่ในรูปแบบ Json ได้
รวมร่าง Source Code ทั้งหมดใน Step ที่ 5 จะได้ออกมาหน้าตาแบบนี้
[Filename: main.go]package mainimport (
"encoding/json"
"fmt"
"net/http"
)type addressBook struct {
Firstname string
Lastname string
Code int
Phone string
}func getAddressBookAll(w http.ResponseWriter, r *http.Request) {
addBook := addressBook{
Firstname: "Chaiyarin",
Lastname: "Niamsuwan",
Code: 1993,
Phone: "0870940955",
}
json.NewEncoder(w).Encode(addBook)
}func homePage(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Welcome to the HomePage!")
}func handleRequest() {
http.HandleFunc("/", homePage)
http.HandleFunc("/getAddress", getAddressBookAll)
http.ListenAndServe(":8080", nil)
}
func main() {
handleRequest()
}*** ตัวหนาคือสิ่งที่เพิ่มขึ้นมาใน Step ที่ 5 ***
เพียงเท่านี้และสั่ง go run main.go ได้เลย และทดสอบผ่านหน้าเว็บ หรือ โปรแกรม Postman ก็ได้ผ่าน URL นี้
http://localhost:8080/getAddress
ผลลัพธ์ที่ได้ก็จะหน้าตาประมาณนี้ผ่าน Browser
เพียงเท่านี้เราก็สามารถที่จะทำ RestFulApi แบบง่ายๆ ผ่านภาษา Go ได้แล้ว ในตอนถัดไป ผมจะมาแนะนำการ Deploy ภาษา Go ของเรานั้นเข้าสู่ Server รอติดตามกันนะครับ แล้วเจอกันใหม่