请求头与响应头相关
请求头获取与权限验证有密切关系
代码里有注释,理解理解应该能懂()
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")
}
评论(0)