在 Go Echo 框架中操作 HTTP 請求 (1)
      更新 @ 2019-12-13: 由 Go 1.13 開始,請使用內置的 Go Module 來管理套件。
在上一篇文章中,我們討論瞭如何在 Echo 框架中設置嵌套樣板。
在接下來的部分,我們將繼續介紹如何在 Echo 服務器中發出 HTTP 請求並將結果呈現在客戶端。讓我們從上一篇文章中的例子開始。
設置 API 端點
首先,創建一個新的 API 端點(endpoint)來返回一個簡單的 JSON ,這個稍後會被 Echo 服務器本身調用。
在 api 文件夾中建立新端點
與寫死的 JSON 請求不同,這個新 API 端點的請求結構將被定義在 model/example_request.go 這文件中,在實現時它的內容可以是一個 JSON 物件、HTML 表格或網址參數所提供,然後將其返回給客戶端。
model/example_request.go
package model
type ExampleRequest struct {
  FirstName string `json:"first_name" form:"first_name" query:"first_name"`
  LastName  string `json:"last_name" form:"last_name" query:"last_name"`
}
api/get_full_name.go
package api
import (
  "fmt""net/http"
  "github.com/labstack/echo"
  "gitlab.com/ykyuen/golang-echo-template-example/model"
)
func GetFullName(c echo.Context) error {
  // Bind the input data to ExampleRequest
  exampleRequest := new(model.ExampleRequest)
  if err := c.Bind(exampleRequest); err != nil {
    return err
  }
  // Manipulate the input data
  greeting := exampleRequest.FirstName + " " + exampleRequest.LastName
  return c.JSONBlob(
    http.StatusOK,
    []byte(
      fmt.Sprintf(`{
        "first_name": %q,
        "last_name": %q,
        "msg": "Hello %s"
      }`, exampleRequest.FirstName, exampleRequest.LastName, greeting),
    ),
  )
}
設置上述 API 端點的路由
在 main.go 中添加我們的新 API 端點路由。
...
func main() {
  // Echo instance
  e := echo.New()
  // Instantiate a template registry with an array of template set
  // Ref: https://gist.github.com/rand99/808e6e9702c00ce64803d94abff65678
  templates := make(map[string]*template.Template)
  templates["home.html"] = template.Must(template.ParseFiles("view/home.html", "view/base.html"))
  templates["about.html"] = template.Must(template.ParseFiles("view/about.html", "view/base.html"))
  e.Renderer = &TemplateRegistry{
    templates: templates,
  }
  // Route => handler
  e.GET("/", handler.HomeHandler)
  e.GET("/about", handler.AboutHandler)
  // Route => api
  e.GET("/api/get-full-name", api.GetFullName)
// Start the Echo server
  e.Logger.Fatal(e.Start(":1323"))
}
測試新的 API 端點
運行 Echo 服務器來測試一下。
      這個新端點可以直接為瀏覽器或其它客戶端提供服務,也可以被 Echo 服務器本身調用。
從 Echo 服務器調用 API
建立回應結構型別
與 model/example_request.go 類似,我們需要定義一個 HTTP 回應結構型別。
model/example_response.go
package model
type ExampleResponse struct {
  FirstName string `json:"first_name"`
  LastName  string `json:"last_name"`
  Msg       string `json:"msg"`
}
在 about 頁面中顯示回應的資訊
修改 about handler 的代碼,使其顯示 HTTP 回應的資訊。
handler/about_handler.go
package handler
import (
  "encoding/json""io/ioutil""net/http"
  "github.com/labstack/echo"
  "gitlab.com/ykyuen/golang-echo-template-example/model"
)
func AboutHandler(c echo.Context) error {
  tr := &http.Transport{}
  client := &http.Client{Transport: tr}
  // Call the api
  resp, err := client.Get(
    "http://localhost:1323/api/get-full-name?first_name=Kit&last_name=Yuen",
  )
  if err != nil {
    return err
  }
  defer resp.Body.Close()
  body, err := ioutil.ReadAll(resp.Body)
  // Unmarshal the response into a ExampleResponse struct
  var exampleResponse model.ExampleResponse
  if err = json.Unmarshal(body, &exampleResponse); err != nil {
    return err
  }
  // Please note the the second parameter "about.html" is the template name and should
  // be equal to one of the keys in the TemplateRegistry array defined in main.go
  return c.Render(http.StatusOK, "about.html", map[string]interface{}{
    "name": "About",
    "msg": exampleResponse.Msg,
  })
}
測試 about 頁面
啟動 Echo 服務器並瀏覽 about 頁面,我們可以看到新的問候語。
      項目結構
進行上述更改後,項目結構應如下圖所示。(項目重命名為 handling-http-request-in-go-echo-example-1,如果要更改項目名稱,請確保正確設置 Golang 代碼中的 import 語句。)
handling-http-request-in-go-echo-example-1/ ├── api/ # folder of api endpoints │ ├── get_full_name.go # api for get full name ├── handler/ # folder of request handlers │ ├── home_handler.go # handler for home page │ └── about_handler.go # handler for about page ├── model/ # folder of custom struct types │ ├── example_request.go # struct type of get_full_name request │ └── example_response.go # hstruct type of get_full_name response ├── vendor/ # dependencies managed by dep │ ├── github.com/* │ └── golang.org/* ├── view/ # folder of html templates │ ├── base.html # base layout template │ ├── home.html # home page template │ └── about.html # about page template ├── Gopkg.lock # dep config file ├── Gopkg.toml # dep config file └── main.go # programme entrypoint
總結
本文介紹如何在 Echo 框架中設置簡單的 API 端點。由於 Go 是一種強型別語言,因此我們必須先將 JSON 請求與回應的結構型別,然後才能操作其內容。例如:
- 在 api/get_full_name.go 將 GET 請求綁定到 exampleRequest。
 - 在 handler/about_handler.go 將 GET 回應解組為 exampleResponse。
 
要調用 API,我們可以直接使用 Go 內建的 net/http 標準函式庫。
完整的例子可以在此 gitlab.com 代碼庫上找到。
喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!

- 来自作者
 - 相关推荐