您好,登錄后才能下訂單哦!
package main
import(
"net/http"
"log"
)
func main(){//注冊(cè)某個(gè)函數(shù)專門(mén)響應(yīng)某個(gè)路由"/",函數(shù)簽名符合
http.HandleFunc("/",func(w http.ResponseWriter,r *http.Request){
w.Write([]byte("Hello,this is version 1!"))
})
http.HandleFunc("/bye",sayBye)
log.Println("Starting server ... v1")
log.Fatal(http.ListenAndServe(":4000",nil))
}
func sayBye( w http.ResponseWriter,r *http.Request){
w.Write([]byte("Bye bye,this is version 1!"))
}
go run test.go
2018/07/09 14:32:08 Starting server ... v1
瀏覽器打開(kāi)訪問(wèn):http://localhost:4000/
瀏覽器打開(kāi)訪問(wèn):http://localhost:4000/bye
如何使用mux自定義ServeHTTP,實(shí)現(xiàn)http server呢?
package main
import(
"net/http"
"log"
)
func main(){
mux := http.NewServeMux()
mux.Handle("/",&myHandler{})
mux.HandleFunc("bye",sayBye)
log.Println("Starting server ... v2")
log.Fatal(http.ListenAndServe(":4000",mux))
}
type myHandler struct {}
func (*myHandler) ServeHTTP(w http.ResponseWriter,r *http.Request){
w.Write([]byte("Hello,this is version 2!"))
}
func sayBye(w http.ResponseWriter,r *http.Request){
w.Write([]byte("Bye bye,this is version 2!"))
}
go run test.go
2018/07/09 15:37:35 Starting server ... v2
瀏覽器打開(kāi)訪問(wèn):http://localhost:4000/
瀏覽器打開(kāi)訪問(wèn):http://localhost:4000/bye
瀏覽器打開(kāi)訪問(wèn):http://localhost:4000/abcdef 默認(rèn)也匹配到這里
所有未匹配到的路由都會(huì)匹配到跟 "/" 路由
package main
import(
"net/http"
"log"
)
func main(){
mux := http.NewServeMux()
mux.Handle("/",&myHandler{}) //所有未匹配到的路由都會(huì)匹配到跟路由
mux.HandleFunc("bye",sayBye)
log.Println("Starting server ... v2")
log.Fatal(http.ListenAndServe(":4000",mux))
}
type myHandler struct {}
func (*myHandler) ServeHTTP(w http.ResponseWriter,r *http.Request){
w.Write([]byte("Hello v2,the request url is:"+ r.URL.String()))
}
func sayBye(w http.ResponseWriter,r *http.Request){
w.Write([]byte("Bye bye,this is version 2!"))
}
go run test.go
2018/07/09 15:50:23 Starting server ... v2
瀏覽器打開(kāi)訪問(wèn):http://localhost:4000/nihao 默認(rèn)也匹配到/這里
如何自定義server信息呢?
import(
"net/http"
"log"
"time"
)
func main(){
server :=&http.Server{
Addr: ":4000",
WriteTimeout:2 * time.Second,
}
mux := http.NewServeMux()
mux.Handle("/",&myHandler{}) //所有未匹配到的路由都會(huì)匹配到跟路由
mux.HandleFunc("bye",sayBye)
server.Handler=mux
log.Println("Starting server ... v2")
log.Fatal(server.ListenAndServe)
}
type myHandler struct {}
func (*myHandler) ServeHTTP(w http.ResponseWriter,r *http.Request){
w.Write([]byte("Hello v2,the request url is:"+ r.URL.String()))
}
func sayBye(w http.ResponseWriter,r *http.Request){
w.Write([]byte("Bye bye,this is version 2!"))
}
go run test.go
2018/07/09 15:57:46 Starting server ... v2
2018/07/09 15:57:46 0x120ef70
瀏覽器打開(kāi)訪問(wèn):http://localhost:4000 訪問(wèn)正常
客戶端可以主動(dòng)斷開(kāi)
package main
import(
"net/http"
"log"
"time"
"os"
"os/signal"
)
func main(){
server :=&http.Server{
Addr: ":4000",
WriteTimeout:4 * time.Second,
}
quit := make(chan os.Signal)
signal.Notify(quit,os.Interrupt)
mux := http.NewServeMux()
mux.Handle("/",&myHandler{}) //所有未匹配到的路由都會(huì)匹配到跟路由
mux.HandleFunc("bye",sayBye)
server.Handler=mux
go func(){
<-quit
if err:=server.Close(); err != nil {
log.Fatal("Close server:",err)
}
}()
log.Println("Starting server ... v3")
err := server.ListenAndServe()
if err !=nil{
if err == http.ErrServerClosed{
log.Print("Server closed under request")
}else{
log.Fatal("Server closed unexpected")
}
}
log.Println("Server exit")
}
type myHandler struct {}
func (*myHandler) ServeHTTP(w http.ResponseWriter,r *http.Request){
w.Write([]byte("Hello v2,the request url is:"+ r.URL.String()))
}
func sayBye(w http.ResponseWriter,r *http.Request){
time.Sleep(3*time.Second)
w.Write([]byte("Bye bye,this is version 2!"))
}
2018/07/09 20:53:41 Starting server ... v3
此時(shí)暫停程序,ctrl+c
2018/07/09 20:54:01 Server closed under request
2018/07/09 20:54:01 Server exit
如何實(shí)現(xiàn)不同的路由轉(zhuǎn)發(fā)呢?
package main
import (
"log"
"net/http"
"time"
)
//創(chuàng)建一個(gè)map,進(jìn)行路由的轉(zhuǎn)發(fā)
var mux map[string]func(http.ResponseWriter, *http.Request)
func main() {
server := http.Server{
Addr: ":8090",
Handler: &myHandler{},
ReadTimeout: 5 * time.Second,
}
//通過(guò)路由注冊(cè),/hello 和 /bye 是不同的錄用,調(diào)用不同的func
mux = make(map[string]func(http.ResponseWriter, *http.Request)) //分配點(diǎn)內(nèi)存空間
mux["/hello"] = sayHello
mux["/bye"] = sayBye
err := server.ListenAndServe()
if err != nil {
log.Fatal(err)
}
}
type myHandler struct{}
func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if h, ok := mux[r.URL.String()]; ok { //map的妙用,判斷有沒(méi)有注冊(cè)路由,如果有,找到,ok=true
h(w, r)
return
}
}
func sayHello(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello,this is version 3!"))
}
func sayBye(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Bye,this is version 4!"))
}
go run test.go
瀏覽器訪問(wèn):http://localhost:8090/hello
返回:Hello,this is version 3!
瀏覽器訪問(wèn):http://localhost:8090/bye
返回:Bye,this is version 4!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。