本文以不到百行程式碼,演示從表自動建立,mux路由分發,Gorm增刪改查,httpie測試API全流程作業。
基本思路
Gorm
通過資料庫連線自動在postgres
上建表mux
負責註冊Handler,分發,請求相關資料解析- 實現
curd
操作,handler
資料響應json格式,服務監聽 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
短小精悍,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資料建立
資料庫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"}
原始碼
完整原始碼,請參見API構建 https://gitee.com/pardon110/codes/aqrxkfiy...