杂记
第一,http.StatusUnprocessableEntity 和 422 一样,都是状态值
第二,H其实是一个别名,我们可以看到源码中有说明:
也就是说,这两句其实是一个意思:
ctx.JSON(http.StatusUnprocessableEntity, gin.H{"code": 422, "msg": "手机号必须为11位"})
ctx.JSON(http.StatusUnprocessableEntity, map[string]interface{}{"code": 422, "msg": "手机号必须为11位"})
3,我们在使用Postman测试的时候,需要我们传给后端数据时需要在这里写:
不然我们的go后端接收不到Postman发送的信息的!
一,正式开始
main.go中代码如下
package main
import (
"fmt"
"math/rand"
"net/http"
"time"
"github.com/gin-gonic/gin"
)
func main() {
// 创建一个默认的路由引擎
r := gin.Default()
r.POST("/api/auth/register", func(ctx *gin.Context) {
//获取参数
name := ctx.PostForm("name")
telephone := ctx.PostForm("telephone")
password := ctx.PostForm("password")
//数据验证
if len(telephone) != 11 {
ctx.JSON(http.StatusUnprocessableEntity, gin.H{"code": 422, "msg": "手机号必须为11位"})
// ctx.JSON(http.StatusUnprocessableEntity, map[string]interface{}{"code": 422, "msg": "手机号必须为11位"})
return
}
if len(password) < 6 {
ctx.JSON(http.StatusUnprocessableEntity, gin.H{"code": 422, "msg": "密码不能少于6位"})
return
}
//如果名称没有传,给一个10位的随机数
if len(name) == 0 {
name = RandomString(10)
}
fmt.Println(name, telephone, password)
//判断手机号是否存在
//创建用户
//返回结果
// c.JSON:返回JSON格式的数据
ctx.JSON(200, gin.H{
"msg": "注册成功",
})
})
// 启动HTTP服务,默认在0.0.0.0:8080启动服务
// r.Run()
panic(r.Run())
}
func RandomString(n int) string {
var letters = []byte("asdfghjklqwertyuiopzxcvbnm")
result := make([]byte, n)
rand.Seed(time.Now().Unix())
for i := range result {
result[i] = letters[rand.Intn(len(letters))]
}
return string(result)
}
go run main.go 让我们的程序跑起来!
二,使用Postman测试一下
可以看到在Postman中出现了我们main.go中写的东西,同时也在main.go终端中输出:
证明我们发送POST请求被成功接收到了!
继续测试一下传参数
在终端中可以看到我们通过Postman转送的参数也可以被接收到!
小小总结一下
我们可以从代码中分析到,
name := ctx.PostForm("name")
telephone := ctx.PostForm("telephone")
password := ctx.PostForm("password")
1,这三句是接受前端发送的POST请求中发送过来的三个参数的
ctx.JSON(200, gin.H{
"msg": "注册成功",
})
2,这三句是返回给前端的信息
3,加上数据库
我们使用Gorm
在终端中输入:
go get -u github.com/jinzhu/gorm
然后在我们的main.go里建立一个结构体
type User struct {
gorm.Model
Name string `gorm:"type:varchar(20);not null"`
Telephone string `gorm:"varchar(11);not null,unique"`
Password string `gorm:"size:255;not null"`
}
再建立连接池
这里我使用的是PostgreSQL
(记得先开启服务哦)
优化我们的代码
package main
import (
"fmt"
"math/rand"
"net/http"
"time"
"github.com/gin-gonic/gin"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres" //这里可能需要我们自己在终端下载一下 go get "github.com/jinzhu/gorm/dialects/postgres"
)
type User struct {
gorm.Model
Name string `gorm:"type:varchar(20);not null"`
Telephone string `gorm:"varchar(11);not null,unique"`
Password string `gorm:"size:255;not null"`
}
func main() {
db := InitDB() //获取初始化的DB
defer db.Close() //延时关闭
// 创建一个默认的路由引擎
r := gin.Default()
r.POST("/api/auth/register", func(ctx *gin.Context) {
//获取参数
name := ctx.PostForm("name")
telephone := ctx.PostForm("telephone")
password := ctx.PostForm("password")
//数据验证
if len(telephone) != 11 {
ctx.JSON(http.StatusUnprocessableEntity, gin.H{"code": 422, "msg": "手机号必须为11位"})
// ctx.JSON(http.StatusUnprocessableEntity, map[string]interface{}{"code": 422, "msg": "手机号必须为11位"})
return
}
if len(password) < 6 {
ctx.JSON(http.StatusUnprocessableEntity, gin.H{"code": 422, "msg": "密码不能少于6位"})
return
}
//如果名称没有传,给一个10位的随机数
if len(name) == 0 {
name = RandomString(10)
}
fmt.Println(name, telephone, password)
//判断手机号是否存在
if isTelephoneExist(db, telephone) {
ctx.JSON(http.StatusUnprocessableEntity, gin.H{"code": 422, "msg": "用户已经存在,不能注册"})
return
}
//创建用户
newUser := User{
Name: name,
Telephone: telephone,
Password: password,
}
db.Create(&newUser)
//返回结果
// c.JSON:返回JSON格式的数据
ctx.JSON(200, gin.H{
"msg": "注册成功",
})
})
// 启动HTTP服务,默认在0.0.0.0:8080启动服务
// r.Run()
panic(r.Run())
}
func isTelephoneExist(db *gorm.DB, telephone string) bool {
var user User
db.Where("telephone = ?", telephone).First(&user)
if user.ID != 0 {
return true
}
return false
}
func RandomString(n int) string {
var letters = []byte("asdfghjklqwertyuiopzxcvbnm")
result := make([]byte, n)
rand.Seed(time.Now().Unix())
for i := range result {
result[i] = letters[rand.Intn(len(letters))]
}
return string(result)
}
//开启连接池
func InitDB() *gorm.DB {
db, err := gorm.Open("postgres", "host=localhost port=5432 user=postgres dbname=study password=你的数据库的密码 sslmode=disable")
if err != nil {
panic("fail to connect database, err: " + err.Error())
}
//Gorm为我们自动创建数据表
db.AutoMigrate(&User{})
return db
}
运行该程序后,我们可以看到Gorm为我们自动在study数据库下创建好了一个数据表User,它与我们在程序中定义的结构体同名,且内容多了4个(哪四个呢?)
我们使用Postman测试一下:
来到我们的Postgre数据库中,我们可以看到该数据已经插入到数据库中了!