一、基本介绍
Go提供了一系列用于创建Web服务器的标准库,而且通过Go创建一个服务器的步骤非常简单,只要通过net/http包调用ListenAndServe函数并传入网络地址以及负责处理请求的处理器( handler )作为参数就可以了。如果网络地址参数为空字符串,那么服务器默认使用80端口进行网络连接;如果处理器参数为nil,那么服务器将使用默认的多路复用器DefaultServeMux,当然,我们也可以通过调用NewServeMux函数创建一个多路复用器。多路复用器接收到用户的请求之后根据请求的URL来判断使用哪个处理器来处理请求,找到后就会重定向到对应的处理器来处理请求。
二、服务器创建
1、创建服务器的步骤:
1)创建一个函数处理器,函数的入参必须是http.ResponseWriter和http.Request指针类型
2)在main函数中调用http中的HandleFunc函数指定处理指定请求的处理器
3)设置路由。
2、实例
package main
import (
"fmt"
"net/http"
)
//创建处理器函数
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "正在通过处理器函数处理你的请求")
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
3、处理器函数的实现原理:
Go语言拥有一种HandlerFunc函数类型,它可以将一个带有正确签名的函数f转换成一个带有方法f的Handler。
三、多路复用器
1、使用默认的多路复用器
1)使用处理器函数处理请求——推荐使用
package utils
import (
"fmt"
"net/http"
)
/*使用默认的多路复用器*/
/* 1)使用处理器函数处理请求*/
//创建处理器函数
func handler(respone http.ResponseWriter, requst *http.Request) {
fmt.Fprintln(respone, "正在通过处理器函数处理你的请求")
}
func WebHandlerFunc() {
http.HandleFunc("/", handler)
//创建路由
http.ListenAndServe(":8080", nil)
}
2)使用处理器处理请求
package utils
import (
"fmt"
"net/http"
)
/*使用默认的多路复用器*/
/* 2)使用处理器处理请求*/
//创建处理器
type MyHandler struct{}
//处理器方法
func (mh *MyHandler)ServeHTTP(respone http.ResponseWriter, requst *http.Request) {
fmt.Fprintln(respone, "正在通过处理器处理你的请求")
}
func WebHandler() {
myHandler := MyHandler{}
//调用处理器
http.Handle("/",&myHandler)
http.ListenAndServe(":8080", nil)
}
2、通过自定义多路复用器
1)使用处理器函数处理请求
package utils
import (
"time"
"fmt"
"net/http"
)
/*使用自己创建的多路复用器*/
//创建处理器
type MyHandler struct{}
func (m *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "通过详细配置服务器的信息来处理请求!")
}
func main() {
myHandler := MyHandler{}
//创建Server结构,并详细配置里面的字段
server := http.Server{
Addr: ":8080",
Handler: &myHandler,
ReadTimeout: 2 * time.Second,
}
server.ListenAndServe()
}
2)使用处理器处理请求
package utils
import (
"fmt"
"net/http"
)
/*使用自己创建的多路复用器*/
//创建处理器函数
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "通过自己创建的多路复用器处理请求!", r.URL.Path)
}
func WebCustom() {
//创建多路复用器
mux := http.NewServeMux()
// http.HandleFunc("/", handler)
mux.HandleFunc("/", handler)
//创建路由
// http.ListenAndServe(":8080", nil)
http.ListenAndServe(":8080", mux)
}