Skip to content

Pacchetto http di Go

Il pacchetto net/http della libreria standard di Go è eccellente, fornisce un'implementazione completa di client e server HTTP, e consente di creare un server HTTP molto semplice con solo poche righe di codice.

Quasi tutti i framework web nel linguaggio Go sono realizzati incapsulando e modificando il pacchetto http esistente, quindi è altamente consigliato imparare il pacchetto http prima di studiare altri framework.

Esempio Get

Qui non si approfondiranno le conoscenze relative a Http. Per saperne di più, si può cercare su 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))
}

Chiamando direttamente le funzioni sotto il pacchetto Http si possono effettuare richieste semplici, verrà restituito un puntatore e un errore, e dopo la chiamata è necessario chiuderlo manualmente.

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

Client

In generale, non si utilizzano direttamente i metodi sopra menzionati, ma si configura un client per soddisfare esigenze più dettagliate. Questo richiederà l'utilizzo della struct http.Client{}, le opzioni di configurazione disponibili sono quattro:

  • Transport: Configura le opzioni relative alla trasmissione dei dati del client Http, se non presente adotta la strategia predefinita
  • Timeout: Configurazione del tempo di timeout della richiesta
  • Jar: Configurazione relativa ai Cookie
  • CheckRedirect: Configurazione del reindirizzamento

Esempio Semplice

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

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

Qui non si approfondiranno troppo le configurazioni dettagliate, si consiglia di informarsi autonomamente.

Server

Per Go, creare un server http richiede solo una riga di codice.

Il primo parametro è l'indirizzo di ascolto, il secondo è il gestore, se vuoto viene utilizzato il gestore predefinito. Nella maggior parte dei casi è sufficiente utilizzare il gestore predefinito DefaultServeMux.

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

Personalizzato

Naturalmente è possibile configurare manualmente un server

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

Si consiglia di informarsi autonomamente sulle configurazioni dettagliate.

Routing

Per prima cosa è necessario definire una struct che implementi il metodo ServeHTTP(ResponseWriter, *Request) dell'interfaccia Handler, quindi chiamare la funzione 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")
}

Tuttavia, dover definire ogni volta una struct sarà molto macchinoso, si può anche utilizzare direttamente la funzione http.handlerFunc, dobbiamo solo scrivere la funzione di gestione, senza dover creare una struct. Internamente utilizza il tipo adattatore HandlerFunc, il tipo HandlerFunc è un adattatore che consente di utilizzare funzioni ordinarie come gestori HTTP. Se f è una funzione con la firma appropriata, HandlerFunc(f) è un Handler che chiama f.

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

ServerMux è la struct centrale, implementa i metodi di base, DefaultServeMux è l'istanza predefinita.

Proxy Inverso

Il pacchetto http fornisce funzionalità di proxy inverso pronte all'uso

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

Il codice sopra inoltrerà tutte le richieste a https://golang.org/index.

Golang by www.golangdev.cn edit