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

进一步阅读:


Check out similar posts by category: Go