<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## 構建反向代理 本節我們將建立一個反向代理應用。我們的想法是,通過請求http:// localhost:3333,所有流量都將轉發到可配置的主機,響應將轉發到你的瀏覽器。 這可以與端口轉發和ssh隧道結合使用,以便通過中間服務器安全地訪問網站。本節將從頭開始構建反向代理,但標準庫的net/http/httputil包也提供此功能。使用此包,可以通過Director func(*http.Request)修改傳入請求,并且可以通過 ModifyResponse func(*http.Response) error錯誤修改傳出響應。 此外,還支持緩沖響應。 ### 實踐 1. 建立 proxy.go: ``` package proxy import ( "log" "net/http" ) // Proxy 保存了客戶端配置和需要代理的BaseURL地址 type Proxy struct { Client *http.Client BaseURL string } // ServeHTTP 表示代理部署了Handler接口它操縱請求,將其轉發給BaseURL,然后返回響應 func (p *Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) { if err := p.ProcessRequest(r); err != nil { log.Printf("error occurred during process request: %s", err.Error()) w.WriteHeader(http.StatusBadRequest) return } resp, err := p.Client.Do(r) if err != nil { log.Printf("error occurred during client operation: %s", err.Error()) w.WriteHeader(http.StatusInternalServerError) return } defer resp.Body.Close() CopyResponse(w, resp) } ``` 2. 建立 process.go: ``` package proxy import ( "bytes" "net/http" "net/url" ) // ProcessRequest 根據Proxy設置修改請求 func (p *Proxy) ProcessRequest(r *http.Request) error { proxyURLRaw := p.BaseURL + r.URL.String() proxyURL, err := url.Parse(proxyURLRaw) if err != nil { return err } r.URL = proxyURL r.Host = proxyURL.Host r.RequestURI = "" return nil } // CopyResponse獲取客戶端響應并將所有內容寫入原始處理程序中的ResponseWriter func CopyResponse(w http.ResponseWriter, resp *http.Response) { var out bytes.Buffer out.ReadFrom(resp.Body) for key, values := range resp.Header { for _, value := range values { w.Header().Add(key, value) } } w.WriteHeader(resp.StatusCode) w.Write(out.Bytes()) } ``` 3. 建立 main.go: ``` package main import ( "fmt" "net/http" "github.com/agtorre/go-cookbook/chapter7/proxy" ) func main() { p := &proxy.Proxy{ Client: http.DefaultClient, BaseURL: "https://www.golang.org", } http.Handle("/", p) fmt.Println("Listening on port :3333") err := http.ListenAndServe(":3333", nil) panic(err) } ``` 4. 這會輸出: ``` $ go run main.go Listening on port :3333 ``` 在瀏覽器地址欄輸入localhost:3333/,你會看到跳轉到了https://golang.org/。 ### 說明 Go請求和響應對象在很大程度上可以在客戶端和處理程序之間共享。示例代碼接受由滿足Handler接口的Proxy結構獲取的請求。一旦請求可用,它就被修改為在請求之前添加Proxy.BaseURL。最后,響應被復制回ResponseWriter接口。 我們還可以添加一些其他功能,例如請求的基本身份驗證,令牌管理等。這對于代理管理JavaScript或其他客戶端應用程序的會話令牌管理非常有用。 * * * * 學識淺薄,錯誤在所難免。歡迎在群中就本書提出修改意見,以饗后來者,長風拜謝。 Golang中國(211938256) beego實戰(258969317) Go實踐(386056972)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看