net/http包封装了TCP连接和报文解析等细节,使用时只需要和http.ResponseWriter和*http.Request这两个对象交互就行。
对应的处理函数,需要把请求对象传递进来,将处理结果写入相应对象中。
package main
import "net/http"
func main() {
http.HandleFunc("/", handle) // 第一个参数表示处理所有的请求,还没有路由转发;第二个参数表示使用哪个处理函数
http.ListenAndServe(":8080", nil) // 表示监听本地8080端口,nil表示路由表?
//func ListenAndServe(addr string, handler Handler)
//http.Handler对应于HTTP请求,是一个接口,只有一个方法ServeHTTP(ResponseWriter, *Request)
//在第二个参数为nil的情况下,handler默认使用DefaultServeMux
//var DefaultServeMux = &defaultServeMux,而defaultServeMux为 var defaultServeMux ServeMux
//ServuMux is an HTTP request multiplexer,是一个结构体类型,是go默认的路由表
//type ServeMux struct {
// mu sync.RWMutex
// m map[string]muxEntry //存放具体的路由信息, muxEntry是一个结构体,里面包含Handler接口类型变量
// hosts bool // whether any patterns contain hostnames
//}
}
func handle(w http.ResponseWriter, r *http.Request) { // 处理函数,参数为请求对象http.ResponseWriter和响应对象*http.Request
w.Write([]byte("Hello World")) // 不论请求内容是啥,响应都是返回Hello World
}
package main
import (
"net/http"
)
func main() {
http.Handle("/", &helloHandler{}) //第二个参数为结构体类型,绑定一个方法,实现Handler接口
//func Handle(pattern string, handler Handler) Handler是一个接口,只有一个ServeHTTP(ResponseWriter, *Request)方法
http.ListenAndServe(":12345", nil) //监听本地12345端口
}
type helloHandler struct{}
func (this *helloHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello World"))
}
http.Handle和http.HandleFunc的第二个参数都需要一个Handler的具体实现,所以只要实现ServeHTTP方法的都可以作为一个Handler。
package main
import(
"net/http"
)
func main() {
myServer := http.Server{ // 自定义的server
Addr: ":8080",
Handler: &myHandler{}, // 对应的处理函数,暂时缺少一些关于路由的设置,无法进行处理
... // 其他的一些设置
}
myServer.ListenAndServe()
}
type myHandler struct {}
func (this myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { // 这里绑定myHandler使用 this *myHandler 也可以,有什么区别?
// ...
}
当把main函数和对应路由的处理函数放在同一包下不同的文件,运行时需要一同运行。
如下打印r *http.Request
.
使用curl命令向本地webserver发送请求,打印r显示的内容为
&{GET /hello HTTP/1.1 1 1 map[User-Agent:[curl/7.47.0] Accept:[/]] {} 0 [] false localhost:12345 map[] map[] map[] 127.0.0.1:60298 /hello 0xc420062300}。
其中Header为map[User-Agent:[curl/7.47.0] Accept:[/]] ——-Header Header
{} ————Body io.ReadCloser
<nil>
———-GetBody func()(io.ReadCloser, error)
[] ———–TransferEncoding []string
map[] ———–Form url.Values
map[] —————PostForm url.Values
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/hello", handle)
http.ListenAndServe(":12345", nil)
}
func handle(w http.ResponseWriter, r *http.Request) {
fmt.Println(r)
}