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

  1. 结构体Blog中, 字段的首字母必须大写,否则gin返回给前端的json数据为空; 字段的标签``中可以指定该字段转json后的名字

  2. 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;
        }
    }
    
  3. 使用net/http包请求此项目: https://www.cnblogs.com/varyuan/p/14087456.html

posted @ 2020-12-15 22:58  varyuan  阅读(429)  评论(0编辑  收藏  举报