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.
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
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ırTimeout: İstek zaman aşımı süresi yapılandırmasıJar: Cookie ile ilgili yapılandırmaCheckRedirect: Yönlendirme yapılandırması
Basit Örnek
func main() {
client := &http.Client{}
request, _ := http.NewRequest("GET", "https://golang.org", nil)
resp, _ := client.Do(request)
defer resp.Body.Close()
}Header Ekleme
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.
http.ListenAndServe("localhost:8080", nil)Özelleştirme
Elbette özel bir sunucu da yapılandırabilirsiniz
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
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.
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
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.
