GO-GIN学习
三、gin框架返回json
方法一:映射和gin.H
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main(){
r:= gin.Default()
r.GET("/json",func(c *gin.Context){
//方法一:使用map
data:= map[string]interface{}{
"name":"Leeson",
"message":"from Cambridge",
"age":24,
}
c.JSON(http.StatusOK,data)
})
r.Run(":9090")
}
结果反应在图片5,就是返回一串json格式的数据
//方法1其他写法:gin.H
data := gin.H{
"name":"Leeson",
"message":"from Cambridge",
"age":24,
}
这个H是一个type,就是上面方法1一样的结果。
方法二:定义结构体(项目常用)
//方法二:结构体
type msg struct {
Name string
Message string
Age int
}
r.GET("/json2", func(c *gin.Context) {
data := msg{
"fhq",
"lab",
999999,
}
c.JSON(http.StatusOK, data)
})
返回结果:
{
"Name": "fhq",
"Message": "lab",
"Age": 999999
}
最后一个没有逗号。
而且结构体里面的变量必须必须是首字母大写的!!!!否则会丢失!
因为json的序列化,默认是使用go语言标准库的,反射取值,go里面函数方法啥的有首字母小写会导致无法导出,相当于没有这个字段。
如果一定要返回小写,那么就要用tag,进行自定义,json的包做反射操作。
//方法二:结构体 灵活使用tag来做定制化操作
type msg struct {
Name string `json:"name"`
Message string
Age int
}
r.GET("/json2", func(c *gin.Context) {
data := msg{
"fhq",
"lab",
999999,
}
c.JSON(http.StatusOK, data)
})
注意,这里是反引号哦,单引号是不对的。
在Go语言中,结构体字段的标签需要使用反引号(`)而不是单引号(')。
在Go语言中,反引号(`)是一种用于表示原始字符串的字符。使用反引号定义的字符串会保留其原始格式,其中包含的任何特殊字符和转义序列都会被直接输出。例如:
``str := `Hello\nWorld```
fmt.Println(str)以上代码输出的结果是:
Hello\nWorld可以看到,使用反引号定义的字符串中的
\n并没有被转义成一个换行符,而是直接输出了它本身。在Go语言中,反引号还被广泛用于定义结构体字段标签,如我之前所提到的。反引号可以让开发者自定义结构体字段的元数据,例如字段的名称、长度、类型等等,这些元数据可以在后续的代码中被读取和使用。
四、gin获取querystring参数
https://www.sogou.com/web?query=%E9%87%8C%E6%A3%AE
搜索是额外附加信息。问号前面是我们的url,问号+什么等于什么的格式
package main
//querystring
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main(){
r := gin.Default()
r.GET("/web",func(c *gin.Context){
//获取浏览器那边发请求携带的 query string 参数
c.JSON(http.StatusOK,"ok")
})
r.Run(":9090")
}
得到:
"ok"
如果写入为127.0.0.1:9090/web?query=里森返回还是ok,这个时候我们需要的到里森的相关结果
修改:
r.GET("/web",func(c *gin.Context){
//获取浏览器那边发请求携带的 query string 参数
name := c.Query("query")
//通过Query获取请求中携带的querystring参数
c.JSON(http.StatusOK,gin.H{
"name": name,
})
})
可以得到的是格式下各种输入对应的H形式,比如:
{
"name": "里森"
}
{
"name": "泥电"
}
还可以添加默认值,如果查不到,就显示替换的默认值,这里是somebody。
name := c.DefaultQuery("query","somebody") //娶不到就用指定的默认值
第三种就是用getquery,因为这个函数会返回一个布尔值,就用ok来接收,如果接收不到布尔值,就false然后做下面if,返回指定的默认值。
name,ok := c.GetQuery("query")
if !ok {
//取不到
name ="somebody"
}
开始叠加(运用英文的and符号也就是&)
如9090/web?query=里森&age=23
代码修改为:
> r := gin.Default()
>
> // GET请求 URL ?后面的是querystring参数
> // key=value格式,多个key-value用 & 链接
> // eq : /web?query=xxxxxx&age=xxx
>
> r.GET("/web",func(c *gin.Context){
> //获取浏览器那边发请求携带的 query string 参数
> name := c.Query("query")
> age := c.Query("age")
> //通过Query获取请求中携带的querystring参数
> //name := c.DefaultQuery("query","somebody")
> /*name,ok := c.GetQuery("query")
> if !ok {
> //取不到
> name ="somebody"
> }*/
>
> c.JSON(http.StatusOK,gin.H{
> "name": name,
> "age":age,
> })
> })
>
> r.Run(":9090")
> ```
>
> 那么显示:返回出来注意是无序的。
>
> ```
> {
> "age": "23",
> "name": "里森"
> }