路由与传参
1. 无参路由
比如系统是单集群,那么这种就不需要传参了。
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
//handler处理
func HelloHandler(c *gin.Context) {
//gin.Context上下文封装了request和response,可以拿到请求的参数和头部。一个c可以干response的事情,也可以干request的事情
paramName := c.Query("name")
fmt.Println(paramName)
c.String(http.StatusOK, "hello world")
//返回字符串数据,其实也就是一个map
c.JSON(http.StatusOK, gin.H{
"data": "123",
"msg": "请求成功",
})
}
func main() {
//初始化gin以及run
g := gin.Default()
//这里匿名函数也可以,写实际的函数也可以,项目里面写具体的函数,逻辑更加的清晰
g.GET("/hello", HelloHandler)
g.Run(":8000")
}
2. API参数
可以通过
Context
的
Param
方法来获取
API
参数
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func GetBookDetailHandler(c *gin.Context) {
bookId := c.Param("id")
c.String(http.StatusOK, "书籍id:"+bookId)
}
func main() {
g := gin.Default()
g.GET("/book/:id", GetBookDetailHandler)
g.Run(":8000")
}
这种也不是常用的,常用的其实是传递参数的方式。
3. url参数
URL
参数可以通过
DefaultQuery()
或
Query()
方法获取
DefaultQuery()
若参数不存在,返回默认值,
Query()
若不存在,返回空串
http://127.0.0.1:8000/user?name=zhangsan
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
func GetUserDetailHandler(c *gin.Context) {
userName := c.Query("name")
c.String(http.StatusOK, fmt.Sprintln("username:", userName))
}
func main() {
g := gin.Default()
g.GET("/info", GetUserDetailHandler)
g.Run(":8000")
}
4. ShouldBind参数绑定
我们可以基于请求的
Content-Type
识别请求数据类型并利用反射机制
自动提取请求中
QueryString
、
form
表单 、
JSON
、
XML
等参数到结构体中
下面的示例代码演示了
.ShouldBind()
强大的功能
它能够基于请求自动提取
JSON
、
form
表单 和
QueryString
类型的数据,并把值绑定到指定的结构 体对象。(无论是form还是json的都一样去处理)
其实也就是将json反序列化为一个结构体了
type Login struct {
UserName string `json:"username"`
Passwd string `json:"passwd"`
}
func LoginHandler(c *gin.Context) {
var login Login
if err := c.ShouldBind(&login); err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"msg": "请求参数异常" + err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"msg": "参数获取成功",
"data": fmt.Sprintln("姓名:", login.UserName, "密码:", login.Passwd),
})
}
func main() {
r := gin.Default()
r.POST("/login", LoginHandler)
r.Run(":8000")
}
如果是get的话那么就是form的格式
扫描二维码关注公众号,回复:
14604724 查看本文章
响应返回
响应
String和json
// 字符串响应
func ResponseStringHandler(c *gin.Context) {
c.String(http.StatusOK, "返回简单的字符串")
}
// json响应
func ResponseJsonHandler(c *gin.Context) {
//msg和data不是写死的,而是一种很好的返回格式规范
c.JSON(http.StatusOK, gin.H{
"msg": "请求成功",
"data": 123,
})
}
func main() {
g := gin.Default()
g.GET("/api/string", ResponseStringHandler)
g.POST("/api/json", ResponseJsonHandler)
g.Run()
}
下面也是用来处理响应的,先声明一个结构体,然后再将值放进去,然后再返回数据,其实直接gin.H就行了。
func ResponseJsonHandler(c *gin.Context) {
type Data struct {
Msg string `json:"msg"`
Code int `json:"code"` }
d := Data{
Msg: "Json数据",
Code: 1001,
}
c.JSON(http.StatusOK, d)
也可以直接使用 gin.H返回 json数据
//c.JSON(http.StatusOK, gin.H{
// "msg": "success",
//}) }
路由分发
为什么需要路由分发?
我们一个项目有非常多的模块,如果全部写在一块导致代码结构混乱,不利于后续的扩展
按照大的模块,每个模块有自己独立的路由,主路由可以再
main.go
中进行注册
1.
项目结构
.
├── go.mod
├── go.sum
├── main.go
└── routers
├── books.go
└── users.go