Go语言标准库内建提供了net/http包,涵盖了HTTP客户端和服务端的具体实现。使用net/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
muxEntry
的属性DefaultServeMux.Handle()
DefaultServeMux.Handle()
中调用DefaultServeMux.HandleFunc(pattern, handler)
DefaultServeMux
的属性中 映射map中 muxEntry
http.ListenAndServe
启动服务监听ListenAndServe()
ListenAndServe()
中 net.Listen("tcp", addr)
启动tcp服务监听go c.serve(connCtx)
处理业务段(如判断信息,拼接http、找到对应处理函数)综上所述,net/http server.go
一切的基础为ServeMux 和 Handler
Go语言的net/http
包还封装了常用处理器,如 FileServer
,NotFoundHandler
RedirectHandler
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))
}
原文:https://www.cnblogs.com/LC161616/p/13843525.html