文章目录
Gin快速搭建一个web服务
- 下载包
\\新建一个文件,文件名gitstudy,然后右击使用vscode打开,初始化目录,并下载包
go mod init ginstudy
go get -u github.com/gin-gonic/gin
- 新建main.go
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
//1. 创建一个路由引擎,之后可以在路由引擎中添加一些路由和路由处理逻辑
r := gin.Default()
//2. 添加路由到路由引擎,以及指定该路由的处理逻辑
// GET("该路由的路径,处理该路由的逻辑")
r.GET("/ping", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "pong",
})
})
r.GET("/", func(c *gin.Context) {
//c.String
//http.StatusOk, 就是状态码200,http这个包定义了相关状态码别名,直接调用就好
c.String(http.StatusOK, "你在访问首页")
})
//3. 启动gin服务
r.Run() // 默认监听8080,可以修改其他端口,r.Run(:8081)
}
Gin数据交互JSON串内容规范
- 用独立函数返回json串的写法
// 定义一个函数,用于gin处理相关请求的逻辑,并返回json数据
func getUserInfo(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"name": "马云",
"age": 18,
"address": "杭州",
})
}
//使用独立的函数处理逻辑
r.GET("/api/user/info", getUserInfo)
浏览器访问
- 前后端分离时,返回j给前端json串常用的格式,这是相对标准的格式,可以给前端返回数据都按这个格式
/*
{
"status": 200, //请求已经收到,后端处理返回给前端状态码,命名自定义code、statusCode
"message": "查询成功"
"data": {
"name": "马云",
"age": "18",
"address": "杭州",
}
}
*/
Gin使用结构体返回数据给前端
type UserInfo struct {
Username string `json:"username"`
Age int `json:"age"`
Address string `json:"address"`
}
type RetrunData struct {
Status int `json:"status"`
Message string `json:"message"`
Data UserInfo `json:"data"`
}
func retrunDataWithStruct(c *gin.Context) {
UserInfo := UserInfo{
Username: "马云",
Age: 18,
Address: "杭州",
}
RetrunData := RetrunData{
Status: 200,
Message: "用户信息查询",
Data: UserInfo,
}
c.JSON(http.StatusOK, RetrunData)
}
r.GET("/api/usr/infoWithSturct", retrunDataWithStruct)
Gin配置POST类型的路由
跟get配置基本一样,只是访问的需要postman使用post请求
func addUser(c *gin.Context) {
RetrunData := RetrunData{
Status: 200,
Message: "创建成功",
}
c.JSON(http.StatusOK, RetrunData)
}
r.POST("/api/user/add", addUser)
Gin获取GET请求参数
参数是什么?就是url 问号后面的字段。?articleId=149418888,多个参数使用&符号分隔
例如:https://editor.csdn.net/md/?articleId=149418888&username=admin
1.配置接收参数
//接受参数
u := c.Query("username")
//u := c.DefaultQuery("username","小马")
id, _ := strconv.Atoi(c.Query("id"))
//去数据库中查询该用户信息
fmt.Printf("拿到用户名:%s, ID:%d\n", u, id)
发送带参数请求
查看参数是否已接收到
Gin获取POST请求参数-form-data类型
// POST数据提交格式有两种:
// JSON {}
// from-data 表单,数据量比较小使用,两种方法都有用到
func addUser(c *gin.Context) {
// POST获取请求参数
//from-data获取请求参数
u := c.PostForm("username")
age, _ := strconv.Atoi(c.PostForm("age"))
//address := c.PostForm("address")
address := c.DefaultPostForm("address", "北京") //如果请求里没有这个key,就使用默认值,如果传有这个key就以你的配置为准
UserInfo := UserInfo{
Username: u,
Age: age,
Address: address,
}
RetrunData := RetrunData{
Status: 200,
Message: "创建成功",
Data: UserInfo,
}
c.JSON(http.StatusOK, RetrunData)
}
Gin获取POST请求参数-JSON类型
func addUserByJson(c *gin.Context) {
// POST获取请求参数
// JSON接受参数
jsonData, _ := c.GetRawData()
//拿到json串之后,也有两种处理。
//1.转成一个map
var m map[string]interface{}
json.Unmarshal(jsonData, &m)
c.JSON(http.StatusOK, m)
}
Gin获取参数绑定至结构体
//模型绑定
// 可以把请求的数据直接绑定到结构体 // 常用
// JSON接受参数,并且绑定到结构体
func addUserBindStuct(c *gin.Context) {
UserInfo := UserInfo{}
if err := c.ShouldBindJSON(&UserInfo); err != nil {
// 说明绑定失败
fmt.Println("数据绑定失败", err.Error())
c.JSON(http.StatusOK, gin.H{
"message": "参数格式不正确",
"status": 500,
})
} else {
c.JSON(http.StatusOK, UserInfo)
}
}