golang:net/http理解總結


Go語言標准庫內建提供了net/http包,涵蓋了HTTP客戶端和服務端的具體實現。使用net/http包,我們可以很方便地編寫HTTP客戶端或服務端的程序。

http服務端的創建流程

在使用http/net包創建服務端只需要兩個步驟 綁定處理器函數 func(ResponseWriter, *Request)與 啟用監聽 http.ListenAndServe

package main

import "net/http"

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("123"))
	})
	http.ListenAndServe(":8080", nil)
}

通過分析net/http包中server.go 在執行創建http服務端主要執行了下面幾個步驟:

  • http.HandleFunc 綁定處理函數
  • 所有的操作的方法都屬於一個結構體 ServeMux
    • m: 用戶傳入的路由和處理方法的映射表,路由和處理函數被定義為結構體muxEntry的屬性
    • mu: 實例化出來的對象的讀寫鎖
  • 調用DefaultServeMux.Handle()
  • DefaultServeMux.Handle()中調用DefaultServeMux.HandleFunc(pattern, handler)
  • 在將傳入http.HandleFunc()的回調函數,與路由的映射信息,放到該DefaultServeMux的屬性中 映射map中 muxEntry
  • http.ListenAndServe 啟動服務監聽
  • 實例化一個server結構體
  • 調用 ListenAndServe()
  • ListenAndServe()net.Listen("tcp", addr) 啟動tcp服務監聽
  • Serve()中 appcet()處理用戶連接,go c.serve(connCtx) 處理業務段(如判斷信息,拼接http、找到對應處理函數)

綜上所述,net/http server.go 一切的基礎為ServeMux 和 Handler

Go語言的net/http包還封裝了常用處理器,如 FileServerNotFoundHandler RedirectHandler

http客戶端的使用

package main

import (
	"bytes"
	"fmt"
	"net/http"
	"reflect"
)

func main() {
	resp, err := http.Get("http://www.baidu.com")

	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(reflect.TypeOf(resp.Body)) // *http.gzipReader
	b := bytes.NewBuffer(make([]byte, 1024))
	b.ReadFrom(resp.Body)
	fmt.Println(string(b.Bytes()))
}

post請求

package main

import (
	"net/http"
	"fmt"
	"io/ioutil"
	"net/url"
)

func main() {

	postParam := url.Values{
		"user":      {"xxxxxx"},
		"Pwd": {"1"},
	}

	resp, err := http.PostForm("http://www.baidu.com/loginRegister/login", postParam)
	if err != nil {
		fmt.Println(err)
		return
	}

	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println(string(body))
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM