Skip to content

Package Http Go

Package net/http standar Go sangat unggul, menyediakan implementasi klien dan server HTTP yang sangat lengkap, hanya dengan beberapa baris kode sudah dapat membangun server HTTP yang sangat sederhana.

Hampir semua framework web dalam bahasa Go dibuat berdasarkan enkapsulasi dan modifikasi package http yang sudah ada. Oleh karena itu, sangat disarankan untuk mempelajari package http terlebih dahulu sebelum mempelajari framework lainnya.

Contoh Get

Tentang pengetahuan Http, tidak akan dijelaskan lebih lanjut di sini. Jika ingin mengetahui lebih banyak, Anda dapat mencarinya di Baidu.

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))
}

Dengan langsung memanggil fungsi di bawah package Http, sudah dapat membuat permintaan sederhana, akan mengembalikan pointer dan error, setelah dipanggil harus ditutup secara manual.

Contoh 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()
}

Klien

Secara umum, kita tidak akan langsung menggunakan metode di atas, tetapi akan mengonfigurasi klien sendiri untuk mencapai kebutuhan yang lebih detail. Ini akan menggunakan struct http.Client{}, total ada empat item konfigurasi yang tersedia:

  • Transport: Konfigurasi terkait transmisi data klien Http, jika tidak ada akan menggunakan strategi default
  • Timeout: Konfigurasi waktu timeout permintaan
  • Jar: Konfigurasi terkait Cookie
  • CheckRedirect: Konfigurasi redirect

Contoh Sederhana

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

Menambahkan 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()
}

Beberapa konfigurasi detail tidak akan dijelaskan terlalu banyak di sini, silakan pelajari sendiri.

Server

Untuk Go, membuat server http hanya membutuhkan satu baris kode.

Parameter pertama adalah alamat yang didengarkan, parameter kedua adalah handler, jika kosong maka akan menggunakan handler default. Dalam kebanyakan kasus, cukup menggunakan handler default DefaultServeMux.

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

Kustomisasi

Tentu saja, Anda juga dapat mengonfigurasi server secara kustom

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

Beberapa konfigurasi detail silakan pelajari sendiri.

Rute

Pertama-tama, Anda perlu mendefinisikan struct kustom yang mengimplementasikan metode ServeHTTP(ResponseWriter, *Request) dalam antarmuka Handler, kemudian panggil fungsi 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("implementasi saya")
}

Namun, setiap kali harus mendefinisikan struct kustom akan sangat merepotkan, Anda juga dapat langsung menggunakan fungsi http.handlerFunc, kita hanya perlu menulis fungsi handler, sehingga tidak perlu membuat struct. Di dalamnya menggunakan tipe adapter HandlerFunc, tipe HandlerFunc adalah adapter yang memungkinkan fungsi biasa digunakan sebagai handler HTTP. Jika f adalah fungsi dengan tanda tangan yang sesuai, HandlerFunc(f) adalah Handler yang memanggil f.

go
func main() {
   http.HandleFunc("/index", func(responseWriter http.ResponseWriter, request *http.Request) {
      fmt.Println(responseWriter, "index")
   })
   http.ListenAndServe(":8080", nil)
}

ServerMux adalah struct inti, mengimplementasikan metode dasar, DefaultServeMux adalah instance default.

Proxy Terbalik

Package http menyediakan fungsi proxy terbalik yang siap pakai

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)
}

Kode di atas akan meneruskan semua permintaan ke https://golang.org/index.

Golang by www.golangdev.cn edit