Skip to content

Go แพ็กเกจ http

แพ็กเกจ net/http ในภาษา Go นั้นยอดเยี่ยมมาก จัดเตรียมการใช้งานไคลเอนต์และเซิร์ฟเวอร์ HTTP ที่สมบูรณ์แบบ สามารถสร้างเซิร์ฟเวอร์ HTTP ที่เรียบง่ายได้ด้วยโค้ดเพียงไม่กี่บรรทัด

เฟรมเวิร์ก web ของภาษา Go เกือบทั้งหมดเป็นการห่อหุ้มและแก้ไขแพ็กเกจ http ที่มีอยู่แล้ว ดังนั้นจึงแนะนำให้เรียนรู้แพ็กเกจ http ก่อนเรียนรู้เฟรมเวิร์กอื่น

ตัวอย่าง Get

เกี่ยวกับความรู้ Http ที่เกี่ยวข้องจะไม่กล่าวถึงที่นี่อีก หากต้องการเรียนรู้เพิ่มเติมสามารถไปค้นหาได้

go
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

go
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: กำหนดค่า Cookie
  • CheckRedirect: กำหนดค่าการเปลี่ยนเส้นทาง

ตัวอย่างง่าย

go
func main() {
  client := &http.Client{}
  request, _ := http.NewRequest("GET", "https://golang.org", nil)
  resp, _ := client.Do(request)
  defer resp.Body.Close()
}

เพิ่ม header

go
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

go
http.ListenAndServe("localhost:8080", nil)

กำหนดเอง

แน่นอนสามารถกำหนดค่าเซิร์ฟเวอร์เองได้

go
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()

go
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

go
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 แบบ开箱即用

go
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

Golang by www.golangdev.cn edit