HTTP 编程
Go 语言标准库内建提供了 net/http 包,涵盖了 HTTP 客户端和服务端的具体实现。使用net/http 包,我们可以很方便地编写 HTTP 客户端或服务端的程序。
HTTP服务端
package main
import (
"fmt"
"net/http"
)
// w 给客户端回复数据 req 读取客户端发送的数据
func HandConn(w http.ResponseWriter, req *http.Request) {
fmt.Println("req.Method=", req.Method)
fmt.Println("req.URL=", req.URL)
fmt.Println("req.Header=", req.Header)
fmt.Println("req.Body=", req.Body)
w.Write([]byte("hello go"))
}
func main() {
//注册处理函数,用户连接,自动调用指定的处理函数
http.HandleFunc("/", HandConn)
http.ListenAndServe(":8000", nil)
}
HandleFunc底层
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
if use121 {
DefaultServeMux.mux121.handleFunc(pattern, handler)
} else {
DefaultServeMux.register(pattern, HandlerFunc(handler))
}
}
- “/”可以指定我们在网址后面输入的东西。
handler func(ResponseWriter, *Request)
func HandConn(w http.ResponseWriter, req *http.Request) {
fmt.Println("req.Method=", req.Method)
fmt.Println("req.URL=", req.URL)
fmt.Println("req.Header=", req.Header)
fmt.Println("req.Body=", req.Body)
w.Write([]byte("hello go"))
}
- w 给客户端回复数据 req 读取客户端发送的数据
这时,我们在浏览器输入,就可以得到我们想要的响应。
实际上,服务端GO语言,已经为我们提供好了。
HTTP客户端
package main
import (
"fmt"
"net/http"
)
func main() {
//resp, err := http.Get("http://www.baidu.com")
resp, err := http.Get("http://127.0.0.1:8000")
if err != nil {
fmt.Println("http.Get.err=", err)
return
}
defer resp.Body.Close()
fmt.Println("Status=", resp.Status)
fmt.Println("StatusCode=", resp.StatusCode)
fmt.Println("Header=", resp.Header)
fmt.Println("Body=", resp.Body)
buf := make([]byte, 4*1024)
var tmp string
for {
n, err := resp.Body.Read(buf)
if n == 0 {
fmt.Println("read err=", err)
break
}
tmp += string(buf[:n])
}
fmt.Println("tmp=", tmp)
}
- 打开刚刚写得服务端
- 在打开客户端