使用 Mux, Go, PostgreSQL, GORM 構建 API

pardon110發表於2019-11-15

本文以不到百行程式碼,演示從表自動建立,mux路由分發,Gorm增刪改查,httpie測試API全流程作業。

基本思路

  1. Gorm 通過資料庫連線自動在postgres上建表
  2. mux 負責註冊Handler,分發,請求相關資料解析
  3. 實現 curd 操作,handler 資料響應json格式,服務監聽
  4. httpie 快速測試API介面

第三方包

mux 類似 nodejs 中的 director,小巧簡單易用,非常適合 api 開發

  • github.com/gorilla/mux 路由分發包,支援正則,分組,子路由,子域名等
  • github.com/jinzhu/gorm 面向介面程式設計的go語言orm庫
  • github.com/jinzhu/gorm/dialects/postgres psql的gorm驅動版本
  • github.com/lib/pq psql對應的go語言資料型別對映庫,用於結構體匹配建表

自動建表

homestead環境整合了postgres,其預設的資料庫帳號(homestead)密碼(secret)

Gorm定義資源 模型

type Resource struct {
     gorm.Model

     Link        string
     Name        string
     Author      string
     Description string
     Tags        pq.StringArray `gorm:"type:varchar(64)[]"`
 }

postgres 資料庫連線,db.AutoMigrate 自動建立表結構

     db, err = gorm.Open(
         "postgres",
         "host=127.0.0.1 user=homestead dbname=postgres sslmode=disable  password=secret",
     )
     if err != nil {
         panic(err)
     }
     defer db.Close()
     db.AutoMigrate(&Resource{})

入庫檢視錶相關資訊如下

使用 Mux, Go, PostgreSQL, GORM 構建 API

路由分發

mux 短小精悍,API該有的功能它都具備,除支援路徑正則,命名路由外,還支援中介軟體等

     router := mux.NewRouter()

     router.HandleFunc("/resources", GetResources).Methods("GET")
     router.HandleFunc("/resources/{id}", GetResource).Methods("GET")
     router.HandleFunc("/resources", CreateResource).Methods("POST")
     router.HandleFunc("/resources/{id}", DeleteResource).Methods("DELETE")

     log.Fatal(http.ListenAndServe(":"+os.Getenv("PORT"), router))

實現Handler

用gorm運算元據庫實現curd,使用標準庫json包響應資料,用mux提取路徑引數(iris中術語)

 func GetResources(w http.ResponseWriter, r *http.Request) {
     var resources []Resource
     db.Find(&resources)
     json.NewEncoder(w).Encode(&resources)
 }

 func GetResource(w http.ResponseWriter, r *http.Request) {
     params := mux.Vars(r)
     var resource Resource
     db.First(&resource, params["id"])
     json.NewEncoder(w).Encode(&resource)
 }

 func CreateResource(w http.ResponseWriter, r *http.Request) {
     var resource Resource
     json.NewDecoder(r.Body).Decode(&resource)
     db.Create(&resource)
     json.NewEncoder(w).Encode(&resource)
 }

 func DeleteResource(w http.ResponseWriter, r *http.Request) {
     params := mux.Vars(r)
     var resource Resource
     db.First(&resource, params["id"])
     db.Delete(&resource)

     var resources []Resource
     db.Find(&resources)
     json.NewEncoder(w).Encode(&resources)
 }

httpie測試

HTTP謂詞 請求路徑 說明
POST /resources 建立
GET /resources/{id} 檢視
PUT /resources/{id} 修改
GET /resources 查全部
DELET /resources/{id} 刪除

示例新增資源測試,shell開啟服務程式,左側視窗連線postgres檢視庫記錄,右側用 Hettpie 進行Post資料建立

使用 Mux, Go, PostgreSQL, GORM 構建 API

資料庫sql查詢輸出結果

postgres=# select link,name,author,tags from resources order by id desc limit 1;
       link       |   name    |  author   |        tags
------------------+-----------+-----------+--------------------
 www.pardon110.cn | pardon110 | pardon110 | {good,"very good"}

原始碼

完整原始碼,請參見db分支 https://gitee.com/pardon110/ShortUrl/blob/...

相關文章