HTTP
单控制器
Golang下的net/http包下有MerveMux实现了Front设计模式的Front窗口,ServeMux负责接收请求并把请求分发给处理器(Handler),http.ServeMux实现了Handler接口。
多控制器
多控制器,不同的请求交给不同的处理单元,支持两种多处理方式:1、多处理器(Handler),2、多个处理函数(HandleFunc)。
多个处理函数(HandleFunc)
多处理函数比多处理器方式简单,直接把资源路径与函数绑定。
HTTP Cookie
Cookie是客户端存储技术,以键值对的形式存在,在B/S架构中,服务器端产生Cookie响应给客户端,浏览器接收后把Cookie存在特定的文件,每次请求浏览器会把Cookie内容放入到请求中。HttpOnly属性,设置为true时防止XSS攻击防御手段之一,HttpOnly控制Cookie的内容是否被JS访问到,默认HttpOnly为false,表示客户端可以通过js获取;Path属性,设置Cookie的访问范围,默认为“/”表示当前项目下所有都可以访问,Path设置路径及子路径内容都可以访问,子路径可以访问父路径,父路径不能访问子路径;Expires属性,Cookie默认存活时间是浏览器不关闭,当浏览器关闭后,Cookie失效,可以通过Expires设置具体什么时候过期,Cookie失效,也可以通过MaxAge设置Cookie多长时间后失效。
案例1
package main
import (
"fmt"
"net/http"
)
func main() {
// HTTP1.1
http.HandleFunc("/", welcome)
http.ListenAndServe("0.0.0.0:8070", nil)
}
func welcome(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Golang Hello world~")
}
案例2
package main
import (
"fmt"
"net/http"
)
func main() {
// 单控制器
myHandler := MyHandler{}
server := http.Server{
Addr: "127.0.0.1:8070",
Handler: &myHandler,
}
server.ListenAndServe()
}
func (h *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Golang HTTP 单控制器实现~")
}
type MyHandler struct {
}
案例3
package main
import (
"fmt"
"net/http"
)
func main() {
// 多控制器
// 多处理器====>多处理器(Handler)
oneHandler := MyOneHandler{}
twoHandler := MyTwoHandler{}
server := http.Server{
Addr: "127.0.0.1:8070",
}
http.Handle("/one", &oneHandler)
http.Handle("/two", &twoHandler)
server.ListenAndServe()
}
func (th *MyTwoHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "多控制器,第二个Handler.")
}
type MyTwoHandler struct{}
func (oh *MyOneHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "多控制器,第一个Handler.")
}
type MyOneHandler struct{}
案例4
package main
import (
"fmt"
"net/http"
)
func main() {
// 多个处理函数(HandleFunc)
server := http.Server{
Addr: "127.0.0.1:8070",
}
http.HandleFunc("/one", one)
http.HandleFunc("/two", two)
server.ListenAndServe()
}
func two(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "多控制器,第二个函数.")
}
func one(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "多控制器,第一个函数.")
}
案例5
package main
import (
"fmt"
"net/http"
)
func main() {
// HTTP获取请求头,获取GET参数
server := http.Server{Addr: "0.0.0.0:8070"}
http.HandleFunc("/", myHandler)
server.ListenAndServe()
}
func myHandler(w http.ResponseWriter, r *http.Request) {
// 获取请求头, 实际类型: map[string][]string
header := r.Header
fmt.Println(header)
fmt.Println(header["User-Agent"])
for k, v := range header {
len := len(v)
if len > 0 {
fmt.Fprintln(w, k, "=", v[:1])
}
}
// http://127.0.0.1:8070/one?id=1&name=123&address=124
// 先解析
r.ParseForm()
// 第1种取值的方式
fmt.Fprintln(w, r.Form)
fmt.Fprintln(w, r.Form["id"][0])
fmt.Fprintln(w, r.Form["name"][0])
fmt.Fprintln(w, r.Form["address"][0])
// 第2种取值的方式
fmt.Fprintln(w, r.FormValue("id"))
fmt.Fprintln(w, r.FormValue("name"))
fmt.Fprintln(w, r.FormValue("address"))
}
restful风格
多路复用
http包中提供了ServeMux实现了多路复用,它会对URL进行解析,然后重定向到正确的处理器上,ServeMux是一个结构体,里面存放了map和读写锁,一般使用的http.Server不指定Handler属性时就是默认的DefaultServeMux。
第三方多路复用实现,Restful风格:go get github.com/gorilla/mux。
案例
package main
import (
"fmt"
"github.com/gorilla/mux"
"net/http"
)
func main() {
// restful风格
// 第三方多路复用实现,Restful风格
r := mux.NewRouter()
r.HandleFunc("/hello/{key}", hello)
r.HandleFunc("/abc", abc)
http.ListenAndServe(":8070", r)
}
func hello(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
fmt.Fprintln(w, "dayinle", vars["key"])
}
func abc(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "abc")
}