上一节我们讲解了gin的基本用法,这一次,我们同样奔着构建一个REST后台的目标,继续修改我们的代码。
package main
import "github.com/gin-gonic/gin"
type Login struct {
User string `form:"user" json:"user" binding:"required"`
Password string `form:"password" json:"password" binding:"required"`
}
func main() {
router := gin.Default()
// Simple group: v1
v1 := router.Group("/v1")
{
v1.POST("/login", loginEndpoint)
}
router.Run(":8080")
}
func loginEndpoint(c *gin.Context) {
var json Login
if err := c.ShouldBindJSON(&json); err == nil {
if json.User == "admin" && json.Password == "admin" {
c.JSON(200, gin.H{"status": "login success"})
} else {
c.JSON(401, gin.H{"status": "login failed"})
}
} else {
c.JSON(400, gin.H{"status": "bad input"})
}
}
这里我们首先通过 router := gin.Default() 创建了一个default router,使用了默认的中间件。关于中间件的概念,我们后面教程会讲。
通常我们的API也是分版本的,这里我们注册了一个v1的group,后面随着迭代,可能会有v2版本。然后注册了一个API。
现在我们来试一试:
$ go run main.go
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[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] POST /v1/login --> main.loginEndpoint (3 handlers)
[GIN-debug] Listening and serving HTTP on :8080
我们打开另外一个窗口,使用httpie发送请求:
$ http POST user=admin password=admin
HTTP/1.1 200 OK
Content-Length: 26
Content-Type: application/json; charset=utf-8
Date: Tue, 09 Jun 2020 07:24:58 GMT
{
"status": "login success"
}
可以看到,已经访问成功了,再试试其他的用户名密码:
$ http POST user=admin password=test
HTTP/1.1 401 Unauthorized
Content-Length: 25
Content-Type: application/json; charset=utf-8
Date: Tue, 09 Jun 2020 07:25:53 GMT
{
"status": "login failed"
}
这里返回了401 Unauthorized的错误,符合预期。
这次我们主要介绍了3点:
- API分组
- 解析requests中的json数据
- 返回json数据已经http的状态码