git clone https://github.com/xmgtony/apiserver-gin.git
sql文件在当前项目docs/init.sql目录下。 因为在实际项目开发中,都是先确定好数据模型,设计好表才开始开发代码,并且要提供原始的sql脚本给code reviewer或者DBA人员审核。 所以这里并没有使用gorm中提供的自动根据struct创建表功能来创建表。为了保持所有环境表结构严格一致或者切换gorm为sqlx等其他数据库访问库,提供原始sql也是很有必要的。
注意:如果以前创建过表,需要重新创建表,因为sql脚本为了支持演示自定义校验器发生了结构变更
项目的配置文件在conf目录下,提供了一个模板文件config.yml, 你可以直接修改该文件或者复制一份。第一次启动只需要配置数据库链接信息。把以下信息改为你的数据库信息。
# 数据库配置(mysql)
database:
dbname: apiserver_gin #数据库名称
host: 127.0.0.1 #数据库服务地址
port: 3306 #数据库端口
username: root #用户名(实际线上不可使用root,请授权一个账户)
password: 123456 #密码
项目的入口函数在cmd的main.go中。所以我们只需要在cmd目录下执行以下命令。
(注意:当前cmd下有多个go文件,包括main.go 都是在package main下,所以不能使用go run main.go方式运行,因为不会加载同包以下其他go文件,会报错。)
>$ go run . -c ../conf/config.yml
不出意外控制台会输出以下信息:
2022/03/17 23:53:12 The application configuration file is loaded successfully!
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /ping --> apiserver-gin/internal/handler/ping.Ping.func1 (8 handlers)
[GIN-debug] POST /login --> apiserver-gin/internal/handler/v1/user.(*UserHandler).Login.func1 (8 handlers)
[GIN-debug] GET /v1/user --> apiserver-gin/internal/handler/v1/user.(*UserHandler).GetUserInfo.func1 (9 handlers)
[GIN-debug] POST /v1/user/login --> apiserver-gin/internal/handler/v1/user.(*UserHandler).Login.func1 (9 handlers)
2022-03-17 23:53:12.953 INFO middleware/logger.go:26 New request start {"appName": "apiserver-gin", "request_id": "0c149ba41f974f47", "host": "127.0.0.1", "host": "127.0.0.1", "path": "/ping", "method": "GET", "body": ""}
2022-03-17 23:53:12.953 INFO middleware/logger.go:37 New request end {"appName": "apiserver-gin", "request_id": "0c149ba41f974f47", "host": "127.0.0.1", "path": "/ping", "cost": "131.344µs"}
[GIN] 2022/03/17 - 23:53:12 | 200 | 357.782µs | 127.0.0.1 | GET "/ping"
2022-03-17 23:53:12.953 INFO server/http.go:81 server started success! port: :8080 {"appName": "apiserver-gin"}
在linux/MacOS下可以使用make来打包项目
# 在项目目录下执行make命令,会自动在当前目录寻找Makefile文件
>$ make
# 控制台会输出
cp -r conf target/
cp ./scripts/startup.sh target/
cd target/ && tar -zcvf apiserver-gin.tar.gz *
a apiserver-gin
a conf
a conf/config.yml
a startup.sh
然后我们可以去target目录查看生成的文件信息
>$ tree target
target
├── apiserver-gin
├── apiserver-gin.tar.gz
├── conf
│ └── config.yml
└── startup.sh
其中有可执行二进制文件 apiserver-gin,配置文件 config.yml 和启动脚本startup.sh以及把这三者打包一起的zip成果包apiserver-gin.tar.gz
我们可以直接使用启动脚本启动项目
>$ ./startup.sh apiserver-gin
# 控制台输出
已启动apiserver-gin...
进程pid:2477
可以查看下进程是否启动
>$ ps aux | grep apiserver-gin
清除打包信息,会删除target目录
>$ make clean
项目启动后可以访问 http://127.0.0.1:8080/v1/user
>$ curl http://127.0.0.1:8080/v1/user
{"request_id":"1c928f4b538147f1","err_code":40001,"message":"invalid token, token is empty"}
返回的信息告诉我们需要一个token,我们需要先登录拿到token, 初始化手机号和密码分别为:10100000000,123456
>$ curl -H "Content-Type:application/json" -X POST -d '{"mobile":"10100000000","password":"123456"}' http://127.0.0.1:8080/login
{
"request_id": "6e513fddbf694d84",
"err_code": 0,
"message": "success",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJpc3MiOiJhcGlzZXJ2ZXItZ2luIiwiZXhwIjoxNjQ4MjE4ODQ5LCJpYXQiOjE2NDc2MTQwNDl9.0dCx7ciHipYYUWlTmGxvUQpTp0vf79XRp5kQWQJTz04",
"expire_at": "2022-03-25 22:34:09"
}
}
可以看到成功后返回了token以及token的过期时间。
如果登录失败,比如手机号码不合法,不是数字,则返回(校验器默认错误信息返回中文,可以在配置文件中配置language字段)
>$ curl -H "Content-Type:application/json" -X POST -d '{"mobile":"abcdefg","password":"123456"}' http://127.0.0.1:8080/login
{
"request_id": "0fa692b7b2ab4098",
"err_code": 40000,
"message": "手机号必须为11位数字"
}
登录成功后可以把token按照如下方式放在header的Authorization字段中。注意该字段后面有个Bearer前缀和一个空格。
curl -H "Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJpc3MiOiJhcGlzZXJ2ZXItZ2luIiwiZXhwIjoxNjQ4MjE4ODQ5LCJpYXQiOjE2NDc2MTQwNDl9.0dCx7ciHipYYUWlTmGxvUQpTp0vf79XRp5kQWQJTz04" http://127.0.0.1:8080/v1/user
{
"request_id": "10e24931c42d4860",
"err_code": 0,
"message": "success",
"data": {
"id": 1,
"created": "2022-03-29 18:23:34",
"modified": "2022-03-29 18:23:34",
"name": "测试账户",
"mobile": "10100000000",
"email": "xmgtony@gmail.com",
"sex": 0,
"age": 0,
"birthday": "0001-01-01 00:00:00"
}
}
使用记账小程序模拟接口(演示用,不代表业务合理性)
curl -H "Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJpc3MiOiJhcGlzZXJ2ZXItZ2luIiwiZXhwIjoxNjQ4MjE4ODQ5LCJpYXQiOjE2NDc2MTQwNDl9.0dCx7ciHipYYUWlTmGxvUQpTp0vf79XRp5kQWQJTz04" \
-X POST -d '{
"bill_date": "2022-05-24 00:00:00",
"origin_incident": "随礼出账",
"amount": "888.88",
"relation": "同事",
"to_name": "小张",
"is_follow": 1,
"remark": "关系不铁,希望尽快回礼"
}' http://localhost:8080/v1/accountBill
{
"request_id": "085929e4a75043bd",
"err_code": 0,
"message": "success"
}
保存成功后查询记账信息
curl -H "Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJpc3MiOiJhcGlzZXJ2ZXItZ2luIiwiZXhwIjoxNjQ4MjE4ODQ5LCJpYXQiOjE2NDc2MTQwNDl9.0dCx7ciHipYYUWlTmGxvUQpTp0vf79XRp5kQWQJTz04" http://localhost:8080/v1/accountBill/list
{
"request_id": "1bcca01142a94bf7",
"err_code": 0,
"message": "success",
"data": [
{
"bill_date": "2022-05-24 00:00:00",
"origin_incident": "随礼出账",
"amount": "888.88",
"relation": "同事",
"to_name": "小张",
"is_follow": 1,
"remark": "关系不铁,希望尽快回礼"
}
]
}
建议做以上接口测试使用postman等可视化工具,书写文档传图不变,才使用curl演示