go http反向代理
go http反向代理
这是比较基础的代理写法
package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
addr := "localhost:8081"
// 代理路由处理函数
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// 请求目标
target := fmt.Sprintf("http://localhost:8080%s", r.URL.String())
req, err := http.NewRequest("GET", target, r.Body)
if err != nil {
log.Fatal(err)
}
req.Header = r.Header
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
_, err = io.Copy(w, resp.Body)
if err != nil {
log.Fatal(err)
}
})
fmt.Println("http proxy running on: ", addr)
err := http.ListenAndServe(addr, nil)
if err != nil {
log.Fatal(err)
}
}
这是进阶的代理写法,通过httputil.NewSingleHostReverseProxy()来构造一个新的代理,然后在http.ListenAndServer()中配置这个代理对象(继承了Handler)
package main
import (
"fmt"
"log"
"net/http"
"net/http/httputil"
"net/url"
)
type Proxy struct {
}
func (Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
target, _ := url.Parse("http://127.0.0.1:8080")
reverseProxy := httputil.NewSingleHostReverseProxy(target)
reverseProxy.ServeHTTP(w, r)
}
func main() {
addr := "localhost:8081"
fmt.Println("http proxy running on: ", addr)
err := http.ListenAndServe(addr, Proxy{})
if err != nil {
log.Fatal(err)
return
}
}

浙公网安备 33010602011771号