G

[Golang]Gin框架 5. 请求头参数获取

RoLingG 2023-06-12

请求头与响应头相关

请求头获取与权限验证有密切关系

代码里有注释,理解理解应该能懂()

1.请求头的各种获取方式

func _Header(context *gin.Context) {
    //用于获取某一个具体的请求头,下面两个请求的请求头都一样(因为字母大小写不区分),单词与单词之间用-连接
    fmt.Println(context.GetHeader("test"))
    fmt.Println(context.GetHeader("Test"))

    //用于获取某一个具体的请求头,下面三个请求的请求头都一样(因为字母大小写不区分),单词与单词之间用-连接
    fmt.Println(context.GetHeader("test-test"))
    fmt.Println(context.GetHeader("Test-test"))
    fmt.Println(context.GetHeader("test-Test"))

    //Header:是一个普通的 map[string][]string,apipost里Header可以重复,但是默认同名的会失效(其他我不清楚,还没用过)
    //fmt.Println(context.Request.Header.Get("test"))    //这样写就和上面的GetHeader功能是一样的,所以如果是Request.Header.Get或者是GetHeader则不用区分大小写,并且返回一个value
    fmt.Println(context.Request.Header) //无.GET默认为获取多个请求头,map形式

    //下面这两个请求是不一样的,因为context.Request.Header是直接拿Header,所以会有大小写区分(因为Header是map的取值方式),拿的都是string的切片
    fmt.Println(context.Request.Header["Test"]) //Header是Test,获取的是Test,所以拿的到数据
    fmt.Println(context.Request.Header["test"]) //Header是Test,获取的是test,拿不到数据

    //apipost里Header可以重复,但是默认同名的会失效(但不知道为什么我在apipost里自写两个一样重复的就只能获取一个,就先暂时认定为有冲突)
    //系统的User-Agent失效,自写的User-Agent实现。
    fmt.Println(context.Request.Header["User-Agent"])
    fmt.Println(context.Request.Header.Get("User-Agent")) //如果用GET方法,有两个重复一样的Header,那就只能获取到第一个名为User-Agent的Header

    //自定义的请求头,用GET方法也是不用区分大小写
    fmt.Println(context.Request.Header.Get("Token"))
    fmt.Println(context.Request.Header.Get("token"))

    context.JSON(200, gin.H{"msg": "请求成功"})    //用于反馈请求头是否获取成功
}

func main() {
    router := gin.Default()
    router.GET("/", _Header)
    router.Run(":80")
}

2.爬虫和用户区别对待(思路)(别人那里摘来的,还是很简单的版本)

func _index(context *gin.Context) {
    userAgent := context.GetHeader("User-Agent") //拿到字符串
    //用正则去匹配
    //字符串的包含匹配
    //strings.Contains(userAgent, "python") //第一个参数是字符串,第二个参数是子串(出现什么就认为是爬虫),返回值是bool值
    if strings.Contains(userAgent, "python") { //走到这一步的都是爬虫    
    //(真爬虫识别方式不是这样识别的,这只是简单的识别,但也能过滤掉大部分简单爬虫),一般都是达到一定访问预值,就响应虚假数据,但容易误伤
        context.JSON(0, gin.H{"data": "响应给爬虫的数据"}) //反馈给爬虫的数据
        return
    }
    context.JSON(0, gin.H{"data": "响应给正常用户的数据"})
    //所以这里会发现apipost里GET User-Agent里有python字样,则会跳转到爬虫响应,而正常页面访问,则跳转到用户响应
}

func main() {
    router := gin.Default()
    router.GET("/index", _index)
    router.Run(":80")
}

3.响应头相关

func main() {
    router := gin.Default()
    //响应头相关
    //设置响应头
    router.GET("/res", func(context *gin.Context) {
        context.Header("Token", "asdgsda123456") //两个参数,一个key一个value
        //响应头一般设置Content-Type,↓是把响应JSON改成响应文本,但同时也不会json数据了,改变浏览器的行为,变成下载文件,但是少文件头(文件下载会涉及,是响应头的问题,后续会有讲解)
        context.Header("Content-Type", "application/text; charset=utf-8")
        context.JSON(0, gin.H{"data": "响应头"}) //这样apipost里的响应头就多了个Token
})
    router.Run(":80")
}
PREV
[Golang]Gin框架 2.响应
NEXT
[Golang]Gin框架 3.查询参数

评论(0)

发布评论