Go HTTP服務器


  • HTTP HandleFunc的簡單使用
package main

import (
	"log"
	"net/http"
)

func main() {
	//注冊一個函數,響應某一個路由
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("hello this is version 1!!"))
	})
	//這里可以單獨寫一個函數傳遞給當前的路由
	http.HandleFunc("/bye", SayBye)
	log.Println("Start version v1")
	log.Fatal(http.ListenAndServe(":4000", nil))

}
func SayBye(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Bye bye, this is version v1"))
	//進行一個流式傳遞,將字符串轉換為byte類型
}

  • 自己定義mux並使用
package main

import (
	"log"
	"net/http"
)

func main() {
	mux := http.NewServeMux()
	//自己創建servemux,然后使用自己的handle方法
	mux.Handle("/", &myHandler{})
	//默認的mux中根路由包含了所有的未匹配的路由
	mux.HandleFunc("/bye", SayBye)

	log.Println("Start version v1")
	log.Fatal(http.ListenAndServe(":4000", mux))

}

type myHandler struct{} //自己定義handler結構
//實現myHandler的ServeHTPP方法
func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Hello this is version 2!,the requeset URL is:" + r.URL.String()))
	//這里可以打印出完整的URL,響應的都是根路由
	//大部分web結構的路由都是在ServerHTTP的方法中實現的
}

func SayBye(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Bye bye, this is version v2"))
	//進行一個流式傳遞,將字符串轉換為byte類型
}

  • ListenAndServe 函數
源碼解析
func ListenAndServe(addr string, handler Handler) error {
	server := &Server{Addr: addr, Handler: handler}
	return server.ListenAndServe()
}
//這里可以看出我們可以自定義server對象,然后進行監聽

//完整源碼
package main

import (
	"log"
	"net/http"
	"time"
)

func main() {
	server := &http.Server{
		Addr:         ":4000",
		WriteTimeout: 4 * time.Second,
	}
	mux := http.NewServeMux()
	//自己創建servemux,然后使用自己的handle方法,mux就是實現了handler接口的一個變量
	mux.Handle("/", &myHandler{})
	//默認的mux中根路由包含了所有的未匹配的路由
	mux.HandleFunc("/bye", SayBye)
	//將mux集成到server當中,server.Handle也是handle類型的接口,所以可以直接賦值
	server.Handler = mux

	log.Println("Start version v3")
	log.Fatal(server.ListenAndServe())

}

type myHandler struct{} //自己定義handler結構
//實現myHandler的ServeHTPP方法
func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Hello this is version 3!,the requeset URL is:" + r.URL.String()))
	//這里可以打印出完整的URL,響應的都是根路由
}

func SayBye(w http.ResponseWriter, r *http.Request) {
	time.Sleep(3 * time.Second)
	w.Write([]byte("Bye bye, this is version v3"))
	//進行一個流式傳遞,將字符串轉換為byte類型
}



  • GO1.8的新功能,允許主動停止http服務器
package main

import (
	"log"
	"net/http"
	"os"
	"os/signal"
	"time"
)

func main() {
	server := &http.Server{
		Addr:         ":4000",
		WriteTimeout: 4 * time.Second,
	}
	quit := make(chan os.Signal)
	//創建chan,用來指示我要退出這個服務器了,麻煩幫忙關閉一下
	signal.Notify(quit, os.Interrupt)
	//注冊這個通知事件,一旦受到這個singal,發送一個對象到這個chan當中,當我接收到任意對象之后,我就知道服務器該退出了
	mux := http.NewServeMux()
	//自己創建servemux,然后使用自己的handle方法,mux就是實現了handler接口的一個變量
	mux.Handle("/", &myHandler{})
	//默認的mux中根路由包含了所有的未匹配的路由
	mux.HandleFunc("/bye", SayBye)
	//將mux集成到server當中,server.Handle也是handle類型的接口,所以可以直接賦值
	server.Handler = mux
	//創建一個gorouting 專門接收這個chan
	go func() {
		<-quit
		if err := server.Close(); err != nil {
			log.Fatal("Close server:", err)
		}
	}()

	log.Println("Start version v3")
	err := server.ListenAndServe()
	if err != nil {
		if err == http.ErrServerClosed {
			log.Print("Server closed under requeset!!")
		} else {
			log.Fatal("Server closed unexpecteed!!")
		}

	}
	log.Println("Server exit!!")

}

type myHandler struct{} //自己定義handler結構
//實現myHandler的ServeHTPP方法
func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Hello this is version 3!,the requeset URL is:" + r.URL.String()))
	//這里可以打印出完整的URL,響應的都是根路由
}

func SayBye(w http.ResponseWriter, r *http.Request) {
	time.Sleep(3 * time.Second)
	w.Write([]byte("Bye bye, this is version v3"))
	//進行一個流式傳遞,將字符串轉換為byte類型
}

  • 基礎模板的用法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM