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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 調用REST API 為REST API編寫客戶端不僅可以幫助你更好地理解相關API,還可以為使用該API的所有應用程序提供有用的工具。本節將探索構建客戶端并展示一些在日常開發中可以使用的策略。 本節我們假設身份驗證由基本auth處理,同時也支持token令牌。為簡單起見,假設我們的API公開了一個端點GetGoogle(),該端點將執行GET獲得的狀態碼返回給https//www.google.com。 ### 實踐 1. 建立 client.go: ``` package rest import "net/http" // APIClient是我們自定義的client type APIClient struct { *http.Client } // NewAPIClient 使用自定義的Transport初始化client func NewAPIClient(username, password string) *APIClient { t := http.Transport{} return &APIClient{ Client: &http.Client{ Transport: &APITransport{ Transport: &t, username: username, password: password, }, }, } } // GetGoogle 是一個API調用 我們抽象出API操作 func (c *APIClient) GetGoogle() (int, error) { resp, err := c.Get("http://www.google.com") if err != nil { return 0, err } return resp.StatusCode, nil } ``` 2. 建立 transport.go: ``` package rest import "net/http" // APITransport 為每個請求執行SetBasicAuth函數 // 實現了RoundTripper接口 type APITransport struct { *http.Transport username, password string } // RoundTrip 在默認傳輸之前添加基礎的auth func (t *APITransport) RoundTrip(req *http.Request) (*http.Response, error) { req.SetBasicAuth(t.username, t.password) return t.Transport.RoundTrip(req) } ``` 3. 建立 exec.go: ``` package rest import "fmt" // Exec 創建API客戶端并使用其GetGoogle方法,然后打印結果 func Exec() error { c := NewAPIClient("username", "password") StatusCode, err := c.GetGoogle() if err != nil { return err } fmt.Println("Result of GetGoogle:", StatusCode) return nil } ``` 4. 建立 main.go: ``` package main import "github.com/agtorre/go-cookbook/chapter6/rest" func main() { if err := rest.Exec(); err != nil { panic(err) } } ``` 5. 這會輸出: ``` Result of GetGoogle: 200 ``` ### 說明 本節演示了如何使用Transport接口隱藏諸如身份驗證,令牌刷新等邏輯。它還演示了通過方法公開API調用。 如果我們需要實現用戶API這樣的東西,可以考慮: ``` type API interface{ GetUsers() (Users, error) CreateUser(User) error UpdateUser(User) error DeleteUser(User) } ``` 如果你已經讀過第5章的"創建存儲接口以實現數據可移植性",會發現可以考慮使用同樣的方式進行思考。通過接口,特別是常見的接口,如RoundTripper接口,這種組合為編寫API提供了很大的靈活性。此外,像我們之前所做的那樣編寫頂級接口并直接傳遞接口而不是client可能很有用。 * * * * 學識淺薄,錯誤在所難免。歡迎在群中就本書提出修改意見,以饗后來者,長風拜謝。 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>

                              哎呀哎呀视频在线观看