Request:用户请求的信息,用来解析用户的请求信息,包括post,get,Cookie,url等信息
Response:服务器需要返回给客户端的信息
Conn:用户的每次请求链接
Handler;处理请求和生成返回信息的处理逻辑
HTTP包详说
Go语言的http有两个核心功能:Conn和ServeMux
Conn:
利用goroutines处理Conn的读写操作,使每个请求都保持独立,相互不阻塞,用以提供高效的网络响应事件
go语言在等待客户顿请求时写下如下代码
c,err:=srv.newConn(rw)
if err!=nil {
continue
}
go c.serve()
ServeMux:
Conn.serve()时内部调用了http默认的路由器,通过默认的路由器将请求的信息交给后台端的处理函数,
ServeMux:的结构体
type ServeMux struct {
mu sync.RWMutex //锁,由于请求涉及到并发处理,因此这里需要一个锁机制
m map[string]muxEntry //路由规则,一个string对应一个mux实体,这里的string就是注册的路由表达式
hosts bool // whether any patterns contain hostnames
}
muxEntry:的结构体
type muxEntry struct {
explicit bool //是否精确匹配
h Handler //这个路由表达式对应哪个handler
pattern string
}
Handler:的结构体
type Handler interface {
ServeHTTP(ResponseWriter, *Request)//路由实现器
}
注:handler是个接口并在其中实现了ServeHTTP(ResponseWriter, *Request)这个接口
总结:
由上得知Go语言支持外部实现路由器ListenAndServer的第二个参数就是用来设置外部路由器的,为一个handler接口。即,外部路由器实现了Handler接口就可以
服务器对象详细
ListenAndServe: 端口监听
http.ListenAndServe(":8090",nil)//端口号和Handler
底层使用Socket原理:
ln, err := net.Listen("tcp", addr)
Conn:用户的每次请求链接
go c.serve(ctx) //为新连接服务。
Request:用户请求的信息,用来解析用户的请求信息,包括post,get,Cookie,url等信息
r.Form //请求的参数列表返回一个map(数据类型为)
r.FormValue("name") //获取某个请求的参数值(若为array则取第一个值,若为一个值则返回一个值)
r.URL.Path //请求服务器项目的路径(没有ip和端口)
r.URL.Scheme
http.ResponseWriter:给客户端返回的信息
w.Write(aa) //将字符数组aa返回给客户端
t,_:=template.ParseFiles("login.html")//ParseFiles创建了一个新的Template,并从以下位置解析了模板定义//指定的文件。返回的模板的名称将具有(基)名称和//(已分析的)第一个文件的内容。必须至少有一个文件。
t.Execute(w,p) //执行将解析模板应用到指定的数据对象,写输出到客户端。p为携带给模板的参数
cookie
r.Cookie("")//从cookie中获取值
r.Cookies()//获取cookie参数中的所有参数
cookie:=http.Cookie{}//自定义cookie
http.SetCookie(w,&cookie)//将cookie返回给客户端