• 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类型
    }
    
    
    • 基础模板的用法
  • 相关阅读:
    appium的python异常处理
    appium环境搭建
    什么是Capability
    移动端自动化测试-WTF Appium
    python-selenium,关于页面滑动
    接口测试的要点
    共享文件夹在本机桌面创建快捷方式
    hosts文件失效,配置的域名不能成功访问
    隔一段时间应用就会挂掉(进程在,但停止响应,也无log输出),必须重启tomcat
    在同步方法中调用异步方法时如何避免死锁问题
  • 原文地址:https://www.cnblogs.com/skymyyang/p/7929602.html
Copyright © 2020-2023  润新知