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
	}
}

posted @ 2025-03-28 19:09  小依昂阳  阅读(15)  评论(0)    收藏  举报