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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 封裝http請求客戶端 在2015年,TomásSenart就使用接口包裝http.Client結構進行了精彩的探討,你可以在https//github.com/gophercon/2015-talks上找到更多相關信息。 本節從他的想法中獲取并演示了一個與http.Client結構的Transport接口相同的示例,類似于我們之前的示例,為REST API編寫客戶端。 本節將為標準的http.Client結構實現日志記錄和基本身份驗證中間件。 它還包括一個decorate函數,可以在需要使用各種中間件時使用。 ### 實踐 1. 建立 config.go: ``` package decorator import ( "log" "net/http" "os" ) // Setup 初始化客戶端接口 func Setup() *http.Client { c := http.Client{} t := Decorate(&http.Transport{}, Logger(log.New(os.Stdout, "", 0)), BasicAuth("username", "password"), ) c.Transport = t return &c } ``` 2. 建立 decorator.go: ``` package decorator import "net/http" // TransportFunc 實現了 RountTripper 接口 type TransportFunc func(*http.Request) (*http.Response, error) // RoundTrip 僅調用原始的函數 func (tf TransportFunc) RoundTrip(r *http.Request) (*http.Response, error) { return tf(r) } // Decorator 是一個方便的函數來表示我們的中間件內部功能 type Decorator func(http.RoundTripper) http.RoundTripper // Decorate 用于包裝所有中間件 func Decorate(t http.RoundTripper, rts ...Decorator) http.RoundTripper { decorated := t for _, rt := range rts { decorated = rt(decorated) } return decorated } ``` 3. 建立 middleware.go: ``` package decorator import ( "log" "net/http" "time" ) // Logger 日志中間件 func Logger(l *log.Logger) Decorator { return func(c http.RoundTripper) http.RoundTripper { return TransportFunc(func(r *http.Request) (*http.Response, error) { start := time.Now() l.Printf("started request to %s at %s", r.URL, start.Format("2006-01-02 15:04:05")) resp, err := c.RoundTrip(r) l.Printf("completed request to %s in %s", r.URL, time.Since(start)) return resp, err }) } } // BasicAuth 基礎身份認證中間件 func BasicAuth(username, password string) Decorator { return func(c http.RoundTripper) http.RoundTripper { return TransportFunc(func(r *http.Request) (*http.Response, error) { r.SetBasicAuth(username, password) resp, err := c.RoundTrip(r) return resp, err }) } } ``` 4. 建立 exec.go: ``` package decorator import "fmt" // Exec 創建一個客戶端,調用google.com然后打印響應 func Exec() error { c := Setup() resp, err := c.Get("https://www.google.com") if err != nil { return err } fmt.Println("Response code:", resp.StatusCode) return nil } ``` 5. 建立 main.go: ``` package main import "github.com/agtorre/go-cookbook/chapter6/decorator" func main() { if err := decorator.Exec(); err != nil { panic(err) } } ``` 6. 這會輸出: ``` started request to https://www.google.com at 2017-01-01 13:38:42 completed request to https://www.google.com in 194.013054ms Response code: 200 ``` 本節將閉包作為一流的公民和接口。主要技巧是具有功能實現接口。這允許封裝具有由函數實現的接口的結構實現的接口。 middleware.go文件包含兩個示例客戶端中間件函數。 這些可以擴展為包含其他中間件,例如更復雜的身份驗證。 本示例也可以與之前的示例結合使用,以生成可以通過其他中間件進行擴展的OAuth2客戶端。 Decorator函數是一種便利的封裝函數,可以這樣比較下: ``` Decorate(RoundTripper, Middleware1, Middleware2, etc) vs var t RoundTripper t = Middleware1(t) t = Middleware2(t) etc ``` 與封裝客戶端相比,這種方法的優點是我們可以保持接口解耦。如果你想要一個功能齊全的客戶端,你還需要實現GET,POST和PostForm等方法。 ### 說明 * * * * 學識淺薄,錯誤在所難免。歡迎在群中就本書提出修改意見,以饗后來者,長風拜謝。 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>

                              哎呀哎呀视频在线观看