Go แพ็กเกจ http
แพ็กเกจ net/http ในภาษา Go นั้นยอดเยี่ยมมาก จัดเตรียมการใช้งานไคลเอนต์และเซิร์ฟเวอร์ HTTP ที่สมบูรณ์แบบ สามารถสร้างเซิร์ฟเวอร์ HTTP ที่เรียบง่ายได้ด้วยโค้ดเพียงไม่กี่บรรทัด
เฟรมเวิร์ก web ของภาษา Go เกือบทั้งหมดเป็นการห่อหุ้มและแก้ไขแพ็กเกจ http ที่มีอยู่แล้ว ดังนั้นจึงแนะนำให้เรียนรู้แพ็กเกจ http ก่อนเรียนรู้เฟรมเวิร์กอื่น
ตัวอย่าง Get
เกี่ยวกับความรู้ Http ที่เกี่ยวข้องจะไม่กล่าวถึงที่นี่อีก หากต้องการเรียนรู้เพิ่มเติมสามารถไปค้นหาได้
func main() {
resp, err := http.Get("https://baidu.com")
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
content, err := io.ReadAll(resp.Body)
fmt.Println(string(content))
}เรียกใช้ฟังก์ชันภายใต้แพ็กเกจ Http โดยตรงก็สามารถส่งคำขออย่างง่ายได้ จะส่งกลับพอยน์เตอร์และข้อผิดพลาด ต้องปิดด้วยตนเองหลังจากเรียก
ตัวอย่าง Post
func main() {
person := Person{
UserId: "120",
Username: "jack",
Age: 18,
Address: "usa",
}
json, _ := json.Marshal(person)
reader := bytes.NewReader(json)
resp, err := http.Post("https://golang.org", "application/json;charset=utf-8", reader)
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
}ไคลเอนต์
โดยทั่วไปเราจะไม่ใช้วิธีการข้างต้นโดยตรง แต่จะกำหนดค่าไคลเอนต์เองเพื่อให้บรรลุความต้องการที่ละเอียดมากขึ้น จะต้องใช้โครงสร้าง http.Client{} มีตัวเลือกการกำหนดค่าทั้งหมดสี่ตัวเลือก
Transport: กำหนดค่าการส่งข้อมูลของไคลเอนต์ Http หากไม่มีจะใช้กลยุทธ์เริ่มต้นTimeout: กำหนดเวลาหมดเขตการร้องขอJar: กำหนดค่า CookieCheckRedirect: กำหนดค่าการเปลี่ยนเส้นทาง
ตัวอย่างง่าย
func main() {
client := &http.Client{}
request, _ := http.NewRequest("GET", "https://golang.org", nil)
resp, _ := client.Do(request)
defer resp.Body.Close()
}เพิ่ม header
func main() {
client := &http.Client{}
request, _ := http.NewRequest("GET", "https://golang.org", nil)
request.Header.Add("Authorization","123456")
resp, _ := client.Do(request)
defer resp.Body.Close()
}การกำหนดค่ารายละเอียดที่นี่จะไม่กล่าวถึงมากเกินไป โปรดเรียนรู้ด้วยตนเอง
เซิร์ฟเวอร์
สำหรับ Go แล้ว การสร้างเซิร์ฟเวอร์ http ต้องการเพียงบรรทัดเดียว
พารามิเตอร์แรกคือที่อยู่การฟัง พารามิเตอร์ที่สองคือโปรเซสเซอร์ หากเป็นค่าว่างจะใช้โปรเซสเซอร์เริ่มต้น DefaultServeMux
http.ListenAndServe("localhost:8080", nil)กำหนดเอง
แน่นอนสามารถกำหนดค่าเซิร์ฟเวอร์เองได้
func main() {
server := &http.Server{
Addr: ":8080",
Handler: nil,
TLSConfig: nil,
ReadTimeout: 0,
ReadHeaderTimeout: 0,
WriteTimeout: 0,
IdleTimeout: 0,
MaxHeaderBytes: 0,
TLSNextProto: nil,
ConnState: nil,
ErrorLog: nil,
BaseContext: nil,
ConnContext: nil,
}
server.ListenAndServe()
}การกำหนดค่ารายละเอียดโปรดเรียนรู้ด้วยตนเอง
เส้นทาง
ก่อนอื่นต้องกำหนดโครงสร้างเองเพื่อใช้งานอินเทอร์เฟซ Handler ในวิธีการ ServeHTTP(ResponseWriter, *Request) แล้วเรียกฟังก์ชัน http.handle()
func main() {
http.Handle("/index", &MyHandler{})
http.ListenAndServe(":8080", nil)
}
type MyHandler struct {
}
func (h *MyHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
fmt.Println("my implement")
}แต่ทุกครั้งที่ต้องกำหนดโครงสร้างเองจะค่อนข้างยุ่งยาก สามารถใช้ฟังก์ชัน http.handlerFunc โดยตรง เราเพียงแค่เขียนฟังก์ชันการจัดการโดยไม่ต้องสร้างโครงสร้าง ภายในใช้อะแดปเตอร์ประเภท HandlerFunc ประเภท HandlerFunc เป็นอะแดปเตอร์ที่อนุญาตให้ใช้ฟังก์ชันธรรมดาเป็นตัวจัดการ HTTP ของ f เป็นฟังก์ชันที่มีลายเซ็นที่เหมาะสม HandlerFunc(f) คือ Handler ที่เรียก f
func main() {
http.HandleFunc("/index", func(responseWriter http.ResponseWriter, request *http.Request) {
fmt.Println(responseWriter, "index")
})
http.ListenAndServe(":8080", nil)
}ServerMux เป็นโครงสร้างหลัก ดำเนินวิธีการพื้นฐาน DefaultServeMux เป็นอินสแตนซ์เริ่มต้น
Reverse Proxy
แพ็กเกจ http จัดเตรียมฟังก์ชัน reverse proxy แบบ开箱即用
func main() {
http.HandleFunc("/forward", func(writer http.ResponseWriter, request *http.Request) {
director := func(request *http.Request) {
request.URL.Scheme = "https"
request.URL.Host = "golang.org"
request.URL.Path = "index"
}
proxy := httputil.ReverseProxy{Director: director}
proxy.ServeHTTP(writer, request)
})
http.ListenAndServe(":8080", nil)
}โค้ดข้างต้นจะส่งคำขอทั้งหมดไปยัง https://golang.org/index
