Go 中的简单反向代理示例
此示例展示一个 Go HTTP 服务器,使用 HTTP 客户端将请求转发到上游服务器。注意此示例不流式传输上游服务器的响应,而是将其下载到 RAM 然后提供给客户端(因此如果你打算提供大文件,可能需要改进此示例)。
此外,注意此示例不为上游请求实现适当的错误处理,因为它只是作为你开发自己的反向代理实现的基本起点。
reverse_proxy.go
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
client := &http.Client{}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// 执行请求
url := "https://techoverflow.net" + r.URL.Path
req, _ := http.NewRequest(r.Method, url, r.Body)
req.Header = r.Header
resp, _ := client.Do(req)
// 此函数结束时清理
defer resp.Body.Close()
// 从请求复制头到响应
header := w.Header()
for name, headers := range resp.Header {
// 迭代具有一个名称的所有头(例如 Content-Type)
for _, hdr := range headers {
header.Add(name, hdr)
}
}
// 将所有响应数据读取到 []byte
body, _ := ioutil.ReadAll(resp.Body)
// 写入头和正文
w.WriteHeader(resp.StatusCode)
w.Write(body)
})
// log.Fatal 显示类似以下错误
// 端口已被使用
fmt.Println("Listening on port 8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}进一步阅读:
- Go net/http 包
- 在 Go 中迭代 HTTP 客户端响应头(我们用作实现头复制机制的基础)
Check out similar posts by category:
Go
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow