【Go开源宝藏】Web框架 GIN 专场 (含思维导图) 持续更新_gin开发路线图

当然这篇文章也会持续更新,记录我的Web框架操练过程
这篇文章也会持续更新哒

思维导图

想获取原图或是.xmind格式可在文末扫描并回复宝藏GIN

请添加图片描述

目录

在这里插入图片描述
github.com/gin-gonic/gin

1. 路由

1.1 基本路由

gin框架中

  • gin.Default() 创建路由实例
  • 给出了 gin.Context,封装了requestresponse
package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default()  // 使用Default创建路由
	r.GET("/", func(c \*gin.Context) {       // 这个c就是上下文,这个路由接收GET请求
		c.String(http.StatusOK, "hello world")  // 返回状态码和数据
	})
	\_ = r.Run(":8000")	//监听端口默认为8080
}

在这里插入图片描述

简单几行代码,就能实现一个非常简单的小网页了啦~

1.2 RESTful 路由

  • gin支持RESTful风格的API。
  • RESTful即Representational State Transfer的缩写。直接翻译的意思是表现层状态转化,是一种互联网应用程序的API设计理念:URL定位资源,用HTTP描述操作。
  • 是目前最主流的前后端交互规范形式。
	r.POST("carts", api.CreateCart)    // POST请求,一般提交表单
	r.GET("carts/:id", api.ShowCarts)  //GET请求,一般获取数据
	r.PUT("carts", api.UpdateCart)     //PUT请求,一般修改数据
	r.DELETE("carts", api.DeleteCart)  // DELETE请求,一般删除数据

1.3 参数接收

  • 获取URL中的参数,一般用于GETDELETE请求。

Gin 中提供了.Param进行参数的获取。

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default() 
	r.GET("/user/:name/:action", func(c \*gin.Context) {
		name := c.Param("name") // 使用Param可以获取路由URL里面的数据
		action := c.Param("action")
		c.String(http.StatusOK, name+" rush "+action)
	})
	\_ = r.Run(":8000")
}

  • 获取表单参数,一般用于POSTPUT请求。

Gin提供了.PostForm方法获取Form表单的值。

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default()
	r.POST("/form", func(c \*gin.Context) {
		username := c.PostForm("username")
		password := c.PostForm("password")
		c.String(http.StatusOK, fmt.Sprintf("username:%s,password:%s", username, password))
	})
	\_ = r.Run(":8000")
}

1.4 文件上传与下载

1.4.1 上传
  • 提供了.FormFile来获取文件
package main

import (
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.POST("/upload", func(c \*gin.Context) {
        file, err := c.FormFile("file")  // file是参数名称
        if err != nil {
            c.String(500, "上传图片出错")   //出错就会返回这个
        }
        c.SaveUploadedFile(file, file.Filename) // 保存文件
        c.String(http.StatusOK, file.Filename)  // 返回状态码
    })
    \_ = r.Run(":8000")
}

1.4.2 下载

1.5 路由拆分

我们一般来说,会把这个路由拆分成URL处理函数。这样能高效管理我们的框架逻辑。

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func helloHandler(c \*gin.Context) {  // 把处理函数放在这里,可以处理一些复杂的业务
    c.JSON(http.StatusOK, gin.H {
        "message": "Hello World!",   // 通过这个 gin.H{} 进行json格式的返回
    })
}
 
// Router 配置路由信息
func Router() \*gin.Engine {
    r := gin.Default()
    r.GET("/hello", helloHandler) // 这样这个路由就比较简洁了。
    return r
}

2. 数据绑定

2.1 json数据格式

  • 定义接收数据的结构体

binding:"required"修饰的字段,是必须有的,没有是会报错的。后面可以跟着限制,满足限制才不会报错。

type Product struct {
	Name          string `form:"name" json:"name"`
	CategoryID    int    `form:"category\_id" json:"category\_id"`
	Title         string `form:"title" json:"title" binding:"required,min=2,max=100"`
	Info          string `form:"info" json:"info" binding:"max=1000"`
	ImgPath       string `form:"img\_path" json:"img\_path"`
	Price         string `form:"price" json:"price"`
	DiscountPrice string `form:"discount\_price" json:"discount\_price"`
	OnSale 		  string `form:"on\_sale" json:"on\_sale"`
	Num 		  string `form:"num" json:"num"`
}

gin框架中提供了一个ShouldBindJSON方法,这样就能可以把json格式解析到结构体中。

func helloHandler(c \*gin.Context) {  // 把处理函数放在这里,可以处理一些复杂的业务
    var data Product 
    if err := c.ShouldBindJSON(&data); err != nil {  
    		// 进行数据的绑定,这样传过来的数据就会传入这个data当中
         // gin.H封装了生成json数据的工具
         c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) // 返回错误信息
         return
      }
    c.JSON(http.StatusOK, gin.H{"status": "200"})
}
 
// Router 配置路由信息
func Router() \*gin.Engine {
    r := gin.Default()
    r.GET("/hello", helloHandler) // 这样这个路由就比较简洁了。
    return r
}

2.2 form表单数据

同样的我们使用2.1中的Product结构体,注意一定要在结构体中,用tags标志form格式

上面的那个Product结构体是用tags标志了form格式和json格式的,所以两个都能用。

func helloHandler(c \*gin.Context) {  // 把处理函数放在这里,可以处理一些复杂的业务
    var data Product 
    if err := c.Bind(&data); err != nil {  
    		// Bind()默认解析并绑定form格式,这样传过来的数据就会传入这个data当中
         c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) // 返回错误信息
         return
      }
    c.JSON(http.StatusOK, gin.H{"status": "200"})
}

2.3 URI

type Product struct {
	Name          string `form:"name" json:"name" uri:"name”`
	CategoryID    int    `form:"category\_id" json:"category\_id" uri:"category\_id"`
	Title         string `form:"title" json:"title" uri:“title binding:"required,min=2,max=100"`
	Info          string `form:"info" json:"info" uri:“info binding:"max=1000"`
	ImgPath       string `form:"img\_path" json:"img\_path" uri:"img\_path"`
	Price         string `form:"price" json:"price" uri:“price`
	DiscountPrice string `form:"discount\_price" json:"discount\_price" uri:"discount\_price"`
	OnSale 		  string `form:"on\_sale" json:"on\_sale" uri:"on\_sale"`
	Num 		  string `form:"num" json:"num" uri:"num"`
}

gin中提供了ShouldBindUri方法进行绑定

func helloHandler(c \*gin.Context) {  // 把处理函数放在这里,可以处理一些复杂的业务
    var data Product 
    if err := c.ShouldBindUri(&data); err != nil {  
         c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) // 返回错误信息
         return
      }
    c.JSON(http.StatusOK, gin.H{"status": "200"})
}

无论是ShouldBindJSON还是Bind还是ShouldBindUri
不过我个人比较喜欢用c.ShouldBind()这种,看个人喜欢吧~

3. 参数验证

3.1 普通情况

type User struct {
    Phone    string   `form:"phone" binding:"required,gt=10"`  //不能为空并且大于10
    Name     string    `form:"name" binding:"required"`
    Birthday time.Time `form:"birthday" time\_format:"2006-01-02"` 
    // 满足格式才能接收,减少了if-else的判断
}

3.2 自定义情况

使用 gopkg.in/go-playground/validator.v8

  • 在结构体上,绑定这个NotNullAndAdmin
type User struct {
	Phone    string   `form:"phone" binding:"required,gt=10"`  //不能为空并且大于10
	Name     string    `form:"name" binding:"NotNullAndAdmin"`  // 自定义一个验证
	Birthday time.Time `form:"birthday" time\_format:"2006-01-02"`
	// 满足格式才能接收,减少了if-else的判断
}

  • 编写自定义方法
func nameNotNullAndAdmin(v \*validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value, field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string) bool {
	if value, ok := field.Interface().(string); ok {
		return value != "" && !("admin" == value)// 字段不能为空,并且不等于 admin
	}
	return true
}

  • 把我们的自定义注册到validator中就好了
	if v, ok := binding.Validator.Engine().(\*validator.Validate); ok {
		\_ = v.RegisterValidation("NotNullAndAdmin", nameNotNullAndAdmin)  //注册定义的验证方法
	}

4. 渲染

4.1 数据的响应

  • Json 前后端主流的交互数据格式,我自己也是经常用这个。
func main() {
	r := gin.Default()
	r.GET("/json",JsonHandler)
	\_ = r.Run(":8000")
}

func JsonHandler(c \*gin.Context)  {
	c.JSON(200, gin.H{"message": "HelloJson", "status": 200})
}

  • Struct
func main() {
	r := gin.Default()	
	r.GET("/struct", StructHandler)
	\_ = r.Run(":8000")
}

func StructHandler(c \*gin.Context) {
	var msg struct {
		Name    string
		Message string
		Number  int
	}
	msg.Name = "FanOne"
	msg.Message = "Golang"
	msg.Number = 10001
	c.JSON(200, msg)
}

  • XML
func main() {
	r := gin.Default()	
	r.GET("/xml", XMLHandler)
	\_ = r.Run(":8000")
}

func XMLHandler(c \*gin.Context)  {
	c.XML(200, gin.H{"message": "HelloXml"})
}

  • YAML
func main() {
	r := gin.Default()	
	r.GET("/yaml", YAMLHandler)
	\_ = r.Run(":8000")
}

func YAMLHandler(c \*gin.Context)  {
	c.YAML(200, gin.H{"message": "HelloYaml"})


### 如何自学黑客&网络安全


#### 黑客零基础入门学习路线&规划


**初级黑客**  
 **1、网络安全理论知识(2天)**  
 ①了解行业相关背景,前景,确定发展方向。  
 ②学习网络安全相关法律法规。  
 ③网络安全运营的概念。  
 ④等保简介、等保规定、流程和规范。(非常重要)


**2、渗透测试基础(一周)**  
 ①渗透测试的流程、分类、标准  
 ②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking  
 ③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察  
 ④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等


**3、操作系统基础(一周)**  
 ①Windows系统常见功能和命令  
 ②Kali Linux系统常见功能和命令  
 ③操作系统安全(系统入侵排查/系统加固基础)


**4、计算机网络基础(一周)**  
 ①计算机网络基础、协议和架构  
 ②网络通信原理、OSI模型、数据转发流程  
 ③常见协议解析(HTTP、TCP/IP、ARP等)  
 ④网络攻击技术与网络安全防御技术  
 ⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现


**5、数据库基础操作(2天)**  
 ①数据库基础  
 ②SQL语言基础  
 ③数据库安全加固


**6、Web渗透(1周)**  
 ①HTML、CSS和JavaScript简介  
 ②OWASP Top10  
 ③Web漏洞扫描工具  
 ④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)  
 恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k


到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?


如果你想要入坑黑客&网络安全,笔者给大家准备了一份:282G全网最全的网络安全资料包评论区留言即可领取!


**7、脚本编程(初级/中级/高级)**  
 在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力.


如果你零基础入门,笔者建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习;搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP, IDE强烈推荐Sublime;·Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,不要看完;·用Python编写漏洞的exp,然后写一个简单的网络爬虫;·PHP基本语法学习并书写一个简单的博客系统;熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选);·了解Bootstrap的布局或者CSS。

**8、超级黑客**  
 这部分内容对零基础的同学来说还比较遥远,就不展开细说了,附上学习路线。  
 ![img](https://img-blog.csdnimg.cn/img_convert/3fd39c2ba8ec22649979f245f4221608.webp?x-oss-process=image/format,png)


#### 网络安全工程师企业级学习路线


![img](https://img-blog.csdnimg.cn/img_convert/931ac5ac21a22d230645ccf767358997.webp?x-oss-process=image/format,png)  
 如图片过大被平台压缩导致看不清的话,评论区点赞和评论区留言获取吧。我都会回复的


视频配套资料&国内外网安书籍、文档&工具


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

![img](https://img-blog.csdnimg.cn/img_convert/153b2778a3fe5198265bed9635d63469.webp?x-oss-process=image/format,png)  
 一些笔者自己买的、其他平台白嫖不到的视频教程。  
 ![img](https://img-blog.csdnimg.cn/img_convert/32eb4b22aa740233c5198d3c161b37e8.webp?x-oss-process=image/format,png)



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值