Golang---路由重定向

 实习了快一个月了,这期间在学企业文化、产品、GO、网络的内容。放假前,领导给了一个任务,做一个代理,用来重定向client的请求路由。
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200102140655965.png)
 如图,就是将所有的请求路由都将dev去掉,然后重定向真实server
type server struct {}
func (s *server) ServeHTTP(w http.ResponseWriter, r *http.Request) {    
	if strings.HasPrefix(r.RequestURI, "/dev") {        
	newReq := new(http.Request)        
	*newReq = *r        
	newReq.RequestURI = ``        
	newReq.URL.Host = "127.0.0.1:6666"        
	newReq.URL.Scheme = "http"        
	newReq.URL.Path = strings.TrimPrefix(r.URL.Path, "/dev")
        resp, err := http.DefaultClient.Do(newReq)        
        if err != nil {            
        	w.WriteHeader(400)            
        	w.Write([]byte(err.Error()))            
        	return        
        }        
        defer resp.Body.Close()        
        io.Copy(w, resp.Body)   
       }
    }
type realServer struct {}
func (s *realServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { 
	fmt.Println("get request -> ", r.RequestURI)    
	w.Write([]byte("hello world"))
}
func main() {    
    go func() {        
		s := new(server)        
		http.Handle("/dev/a", &server{})        	
		http.ListenAndServe(":8081", s)    
    }()     
    go func() {        
		s := new(realServer)        
		http.Handle("/a", &realServer{})        
		http.ListenAndServe(":8888", s)    
    }()
    time.Sleep(time.Millisecond * 200)
    resp, err := http.Get("http://127.0.0.1:8081/dev/a")    
    if err != nil {        
    fmt.Println("request failed", err)        
    return    
   }    
    defer resp.Body.Close()    
    fmt.Print("response ---> ")      
    io.Copy(os.Stdout, resp.Body)
   }
发布了27 篇原创文章 · 获赞 1 · 访问量 1203

猜你喜欢

转载自blog.csdn.net/qq_40484416/article/details/103803342