ภาษา Go ตอน 8 เขียน RestFul Api ด้วย GO

Chaiyarin Niamsuwan
odds.team
Published in
4 min readDec 27, 2018

จากตอนที่แล้ว เราได้เรียนรู้เกี่ยวกับการเขียน 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 ที่เราต้องการแล้ว ได้ดังภาพนี้

ถือว่าตอนนี้เรามาอยู่ Path เดียวกับที่เก็บ Project ภาษา Go แล้ว

ทีนี้เราใช้คำสั่ง mkdir ในการสร้าง Directory ชื่อว่า go-api ดังนี้

[สร้าง Directory ที่ Path /Users/chaiyarin/go/src/github.com/chaiyarin]mkdir go-api

พอสร้างเสร็จแล้วก็จะได้หน้าตาในลักษณะแบบนี้

ตอนนี้ถือว่าเราสร้าง Project 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 ตัว คือ

  1. Port ที่เราต้องการให้ Request จาก Client ส่งเข้ามา ณ ที่นี้คือ Port 8080
  2. 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 แทน

เมื่อสั่ง run แล้วจะไม่เกิดอะไรขึ้น ไม่ต้องตกใจ เราสามารถเข้าไปดูผลที่ผ่าน Browser ได้ โดยใส่ url เป็น

http://localhost:8080/

ถ้าถูกต้อง Browser จะแสดงผลดังนี้

เป็นอันเสร็จพิธีว่า Go Server ของเรานั้นทำงานรอรับ Request ได้แล้ว

เพื่อให้มันเจ๋งไปกว่านั้น เราลองมาทำ 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

ผลลัพธ์ที่ได้ผ่าน Browser
ผลลัพธ์ที่ได้ผ่านโปรแกรม Postman

เพียงเท่านี้เราก็สามารถที่จะทำ RestFulApi แบบง่ายๆ ผ่านภาษา Go ได้แล้ว ในตอนถัดไป ผมจะมาแนะนำการ Deploy ภาษา Go ของเรานั้นเข้าสู่ Server รอติดตามกันนะครับ แล้วเจอกันใหม่

--

--