实习了快一个月了,这期间在学企业文化、产品、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)
}