Skip to content

Go http Paketi

Go dili standart kütüphanesindeki net/http paketi oldukça mükemmeldir ve HTTP istemcisi ile sunucusunun çok kapsamlı bir uygulamasını sağlar, sadece birkaç satır kodla çok basit bir HTTP sunucusu kurabilirsiniz.

Neredeyse Go dilindeki tüm web framework'leri, mevcut http paketinin üzerine封装 ve değişiklik yapar, bu nedenle diğer framework'leri öğrenmeden önce http paketini öğrenmeniz şiddetle tavsiye edilir.

Get Örneği

Http ile ilgili bilgiler burada tekrar edilmeyecektir, daha fazla bilgi edinmek isterseniz Baidu'ya bakabilirsiniz.

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 paketi altındaki fonksiyonları doğrudan çağırarak basit istekler gönderebilirsiniz, bir işaretçi ve hata döndürür, çağrıdan sonra manuel olarak kapatılmalıdır.

Post Örneği

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

İstemci

Genellikle yukarıdaki yöntemleri doğrudan kullanmayız, daha detaylı gereksinimleri karşılamak için kendi istemcimizi yapılandırırız. Bunun için http.Client{} struct'ını kullanırız, sağlanabilecek yapılandırma seçenekleri toplamda dört tanedir:

  • Transport: Http istemcisi veri iletimi ile ilgili yapılandırma seçenekleri, yoksa varsayılan strateji kullanılır
  • Timeout: İstek zaman aşımı süresi yapılandırması
  • Jar: Cookie ile ilgili yapılandırma
  • CheckRedirect: Yönlendirme yapılandırması

Basit Örnek

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

Header Ekleme

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

Detaylı yapılandırmalar burada fazla anlatılmayacaktır, lütfen kendiniz araştırın.

Sunucu

Go için bir http sunucusu oluşturmak sadece bir satır kod gerektirir.

İlk parametre dinlenen adrestir, ikinci parametre işleyicidir, eğer boşsa varsayılan işleyici kullanılır. Çoğu durumda varsayılan işleyici DefaultServeMux kullanılabilir.

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

Özelleştirme

Elbette özel bir sunucu da yapılandırabilirsiniz

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

Detaylı yapılandırmalar için lütfen kendiniz araştırın.

Route

Öncelikle Handler arayüzündeki ServeHTTP(ResponseWriter, *Request) metodunu implement eden özel bir struct tanımlamanız, ardından http.handle() fonksiyonunu çağırmanız gerekir

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

Ancak her seferinde özel bir struct tanımlamak oldukça karmaşık olacaktır, doğrudan http.handlerFunc fonksiyonunu da kullanabilirsiniz, sadece işleme fonksiyonunu yazmamız yeterlidir, böylece struct oluşturmaya gerek kalmaz. İçerisinde adaptör tipi HandlerFunc kullanılır, HandlerFunc tipi bir adaptördür ve normal fonksiyonların HTTP işleyicisi olarak kullanılmasını sağlar. f uygun imzaya sahip bir fonksiyonsa, HandlerFunc(f), f'i çağıran Handler'dır.

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

ServerMux temel struct'tır ve temel metodları implement eder, DefaultServeMux varsayılan örnektir.

Ters Proxy

http paketi hazır ters proxy özelliği sağlar

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

Yukarıdaki kod tüm istekleri https://golang.org/index adresine yönlendirecektir.

Golang by www.golangdev.cn edit