go开源web框架gin的简单使用
go开源web框架gin的简单使用
代码:
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"strconv"
)
// 博客结构体 ,字段首字母必须大写,否则gin不能获取到值返回给前端
// `json:"name"` 配置转json时字段的名字
type Blog struct {
Id uint64 `json:"id"`
Name string `json:"name"`
}
var blogList []Blog
func initBlogList() {
blogList = append(blogList, Blog{1, "java入门宝典"})
blogList = append(blogList, Blog{2, "从python小白到年薪百万"})
blogList = append(blogList, Blog{3, "快来学习现代编程语言go吧"})
}
func main() {
// 初始化博客列表
initBlogList()
fmt.Println("所有博客: ", blogList)
r := gin.Default()
// 查询所有博客, curl localhost:8081/blogs
r.GET("/blogs", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "success",
"data": blogList,
})
})
// get参数查询指定id的博客, curl localhost:8081/blog?id=1
r.GET("/blog", func(c *gin.Context) {
idStr := c.Query("id")
id, _ := strconv.ParseUint(idStr, 10, 0)
for _, v := range blogList {
if v.Id == id {
c.JSON(200, gin.H{
"message": "success",
"data": v,
})
return
}
}
c.JSON(200, gin.H{
"message": "博客不存在",
})
})
// URI中参数查询指定id的博客, curl localhost:8081/blog/3
r.GET("/blog/:id", func(c *gin.Context) {
idStr := c.Param("id")
id, _ := strconv.ParseUint(idStr, 10, 0)
for _, v := range blogList {
if v.Id == id {
c.JSON(200, gin.H{
"message": "success",
"data": v,
})
//
return
}
}
c.JSON(200, gin.H{
"message": "博客不存在",
})
})
// 校验Token请求头值为validate_me则增加博客
// curl -X POST -H "ContentType: application/json" -H "token: validate_me" -d '{"id":4,"name":"下一件大事:flutter"}' localhost:8081/blog
r.POST("/blog", func(c *gin.Context) {
// 注意请求头已被转换为首字母大写其余小写
token, ok := c.Request.Header["Token"]
if ok && token[0] == "validate_me" {
var blog Blog
err := c.ShouldBindJSON(&blog)
if err == nil {
blogList = append(blogList, blog)
fmt.Println("所有博客: ", blogList)
c.JSON(200, gin.H{
"message": "新增博客成功",
})
} else {
c.JSON(400, gin.H{
"message": "新增博客失败",
"err": err,
})
}
} else {
c.JSON(403, gin.H{
"message": "token校验失败",
})
}
})
_ = r.Run(":8081")
}
gin开源地址: https://github.com/gin-gonic/gin
Q&A
-
结构体Blog中, 字段的首字母必须大写,否则gin返回给前端的json数据为空; 字段的标签``中可以指定该字段转json后的名字
-
c.Request.Header中的所有请求头都已经被转换为: 以原有的- 分割之后, 首字母大写其他字母小写形式, 例如
传入 转换后 token Token TOKEN Token to-ken To-Ken 所以前端传的token请求头必须用c.Request.Header["Token"]才能获取到值, 也可以使用如下代码遍历映射c.Request.Header查找值,显然时间复杂度将由O(1)变为O(n), 应该尽量避免使用
for k, v := range c.Request.Header { if strings.EqualFold("token", k) { fmt.Println("token: ", v[0]) } }
- java的springBoot+Tomcat, 会把请求头转换为全小写字母,获取的时候做了不区分大小写的兼容
@RestController public class HeaderController { // curl -X POST -H "Content-Type: application/json" -H "TOKEN: validate_me" localhost:8080/header // 返回请求的所有请求头, 执行上面的curl, 查看响应信息会发现所有请求头都被转换为全小写字母 @PostMapping("/header") public Map<String, String> header(HttpServletRequest request) { Map<String, String> result = new HashMap<>(); Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String name = headerNames.nextElement(); String value = request.getHeader(name); result.put(name, value); } // 获取请求头不区分大小写, 应该是会先被转换成小写字母再去获取 String token = request.getHeader("TOKen"); System.out.println(token); return result; } }
-
使用net/http包请求此项目: https://www.cnblogs.com/varyuan/p/14087456.html