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

本文以不到百行代码,演示从表自动创建,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"}

源码#

完整源码,请参见 API 构建 https://gitee.com/pardon110/codes/aqrxkfiy...

本作品采用《CC 协议》,转载必须注明作者和本文链接
pardon110
开发者 @ 社科大
文章
135
粉丝
24
喜欢
103
收藏
56
排名:105
访问:8.9 万
私信
所有博文
社区赞助商