区块链技术博客
www.b2bchain.cn

WEB篇·第3章·作业求职学习资料

本文介绍了WEB篇·第3章·作业求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

[TOC]

1. 介绍一下Gin

Gin是一个用golang开发的优秀的支持Restful风格的WEB框架。  优秀特性: 快速 -- 基于Radix树的路由,没有反射 中间件 -- 可扩展性高 Crash处理 -- 异常Recovery 路由组 -- 无限嵌套不影响性能 JSON -- 支持最常用的JSON请求解析 GIN渲染 -- 内置渲染

2. Defalut和New有什么不同

区别主要在于是否默认带有中间件:     Default构建的引擎默认带有LoggerRecovery两个中间件,能记录请求信息到日志,可以对异常Crash进行recovery处理。      New则不带任何中间件。

3. 针对表单做restful的处理

restful风格
使用HTTP方法(POST/GET/PUT/DELETE)去对应CRUD操作,“请求=动词+宾语”

restful表单处理示例:

package main  import (     "fmt"     "net/http"      "github.com/gin-gonic/gin" )  type User struct {     Name string `form:"name" binding:"required"`     Age  int    `form:"age" binding:"required"` }  func main() {      r := gin.Default()      userGrp := r.Group("/user")     {         //C         userGrp.POST("/infos", NewUser)         //R         userGrp.GET("/infos", GetUserList)         //U         userGrp.PUT("/infos/:id", UpdateUser)         //D         userGrp.DELETE("/infos/:id", DeleteUser)     }      r.Run() }  func DeleteUser(c *gin.Context) {     id := c.Param("id")     c.JSON(http.StatusOK, gin.H{         "msg":   "ok",         "infos": fmt.Sprintf("%s infos deleted!", id),     }) }  func UpdateUser(c *gin.Context) {     id := c.Param("id")     c.JSON(http.StatusOK, gin.H{         "msg":   "ok",         "infos": fmt.Sprintf("%s infos updated!", id),     }) }  func NewUser(c *gin.Context) {     user := new(User)     err := c.ShouldBind(&user)     if err != nil {         c.JSON(http.StatusBadRequest, gin.H{             "msg": err.Error(),         })         return     }     c.JSON(http.StatusOK, gin.H{         "msg":   "ok",         "infos": fmt.Sprintf("%s - %d", user.Name, user.Age),     })  }  func GetUserList(c *gin.Context) {     users := make([]User, 2)     users = []User{         {"usr01", 21},         {"usr02", 22},     }     c.JSON(http.StatusOK, gin.H{         "msg":   "ok",         "infos": users,     }) }

4. 针对JSON做restful的处理

type User struct {     Name string `binding:"required" json:"name"`     Age  int    `binding:"required" json:"age"` }  //C userGrp.POST("/infos", NewUser)  func NewUser(c *gin.Context) {     user := new(User)     err := c.ShouldBind(&user)     if err != nil {         c.JSON(http.StatusBadRequest, gin.H{             "msg": err.Error(),         })         return     }     c.JSON(http.StatusOK, gin.H{         "msg":   "ok",         "infos": fmt.Sprintf("%s - %d", user.Name, user.Age),     }) }

5. 举例如何用到中间件

// 一个耗时计算中间件示例 // 1) 中间件定义 func Cost(c *gin.Context){     now := time.Now()     c.Next()     fmt.Printf("cost: %vn", time.Now().Sub(now)) }  // 2) 中间件注册 //C userGrp.POST("/infos", Cost, NewUser)

6. 如果多个中间件,调用顺序如何?(代码演示)

func Log(c *gin.Context) {     fmt.Println("log middleware sample req begin")     c.Next()     fmt.Println("log middleware sample rsp finish") }  func Cost(c *gin.Context) {     now := time.Now()     fmt.Printf("ReqTimeBegin: %vn", now)     c.Next()     fmt.Printf("cost: %vn", time.Now().Sub(now)) }  //C userGrp.POST("/infos", Cost, Log, NewUser)

WEB篇·第3章·作业

7. Gin终止其中一个中间件,要如何做?

通过c.Abort()即可。

8. 如何优雅退出Gin的程序

Gin的启动通过子goroutine,并在主goroutine中通过监控退出信号来达到Gin程序的退出。

package main  import (     "context"     "log"     "os"     "os/signal"     "syscall"     "time"      "github.com/gin-gonic/gin" )  func main() {     r := gin.Default()      r.GET("/notify/signal/shutdown", func(c *gin.Context) {         time.Sleep(5 * time.Second)         c.String(http.StatusOK, "Test notify signal to shutdown server !")     })      go func() {         r.Run()     }()      // 等待中断信号来优雅地关闭服务器,为关闭服务器操作设置一个5秒的超时     quit := make(chan os.Signal, 1) // 创建一个接收信号的通道      signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) // 此处不会阻塞     <-quit // 阻塞在此,当接收到上述两种信号时才会往下执行      log.Println("Server exited") }

9. 利用之前的Go语言学到的知识,可以总结出 一次请求处理的大体流程?

1)初始化gin引擎     Default()或New()差别在于是否在初始化时注册LoggerRecovery中间件  2)路由/路由组注册(中间件合并,基数树生成)     engine.RouterGroup.engine = engine指向1)中初始化的引擎     Group(relativePath string, handlers ...HandlerFunc)     或 POST/GET/DELETE(relativePath string, handlers ...HandlerFunc)等      对全局、路由组、单路由上注册的中间件进行合并     对不同method形成各自的基数树trees(切片/最多9棵)  3)启动引擎     解析服务地址和服务端口     创建Socket()     开始监听Accept()     有新链接,则派生goroutine进行服务         c := srv.newConn(rw)         go c.serve(connCtx)  4) 提供 handler.ServeHTTP(rw, req) 服务     上下文池子中取空闲 Context         engine.handleHTTPRequest(c)         解析method urlpath          根据path路由取得对应的注册的中间件链并执行         value := root.getValue(rPath, c.params, unescape)         if value.params != nil {             c.Params = *value.params         }         if value.handlers != nil {             c.handlers = value.handlers             c.fullPath = value.fullPath             c.Next()             c.writermem.WriteHeaderNow()             return         }  5) 服务处理完毕     归还Context     engine.pool.Put(c)

10. gin返回html的处理(选做)

11. gin如何处理静态文件(选做)

[TOC]

1. 介绍一下Gin

Gin是一个用golang开发的优秀的支持Restful风格的WEB框架。  优秀特性: 快速 -- 基于Radix树的路由,没有反射 中间件 -- 可扩展性高 Crash处理 -- 异常Recovery 路由组 -- 无限嵌套不影响性能 JSON -- 支持最常用的JSON请求解析 GIN渲染 -- 内置渲染

2. Defalut和New有什么不同

区别主要在于是否默认带有中间件:     Default构建的引擎默认带有LoggerRecovery两个中间件,能记录请求信息到日志,可以对异常Crash进行recovery处理。      New则不带任何中间件。

3. 针对表单做restful的处理

restful风格
使用HTTP方法(POST/GET/PUT/DELETE)去对应CRUD操作,“请求=动词+宾语”

restful表单处理示例:

package main  import (     "fmt"     "net/http"      "github.com/gin-gonic/gin" )  type User struct {     Name string `form:"name" binding:"required"`     Age  int    `form:"age" binding:"required"` }  func main() {      r := gin.Default()      userGrp := r.Group("/user")     {         //C         userGrp.POST("/infos", NewUser)         //R         userGrp.GET("/infos", GetUserList)         //U         userGrp.PUT("/infos/:id", UpdateUser)         //D         userGrp.DELETE("/infos/:id", DeleteUser)     }      r.Run() }  func DeleteUser(c *gin.Context) {     id := c.Param("id")     c.JSON(http.StatusOK, gin.H{         "msg":   "ok",         "infos": fmt.Sprintf("%s infos deleted!", id),     }) }  func UpdateUser(c *gin.Context) {     id := c.Param("id")     c.JSON(http.StatusOK, gin.H{         "msg":   "ok",         "infos": fmt.Sprintf("%s infos updated!", id),     }) }  func NewUser(c *gin.Context) {     user := new(User)     err := c.ShouldBind(&user)     if err != nil {         c.JSON(http.StatusBadRequest, gin.H{             "msg": err.Error(),         })         return     }     c.JSON(http.StatusOK, gin.H{         "msg":   "ok",         "infos": fmt.Sprintf("%s - %d", user.Name, user.Age),     })  }  func GetUserList(c *gin.Context) {     users := make([]User, 2)     users = []User{         {"usr01", 21},         {"usr02", 22},     }     c.JSON(http.StatusOK, gin.H{         "msg":   "ok",         "infos": users,     }) }

4. 针对JSON做restful的处理

type User struct {     Name string `binding:"required" json:"name"`     Age  int    `binding:"required" json:"age"` }  //C userGrp.POST("/infos", NewUser)  func NewUser(c *gin.Context) {     user := new(User)     err := c.ShouldBind(&user)     if err != nil {         c.JSON(http.StatusBadRequest, gin.H{             "msg": err.Error(),         })         return     }     c.JSON(http.StatusOK, gin.H{         "msg":   "ok",         "infos": fmt.Sprintf("%s - %d", user.Name, user.Age),     }) }

5. 举例如何用到中间件

// 一个耗时计算中间件示例 // 1) 中间件定义 func Cost(c *gin.Context){     now := time.Now()     c.Next()     fmt.Printf("cost: %vn", time.Now().Sub(now)) }  // 2) 中间件注册 //C userGrp.POST("/infos", Cost, NewUser)

6. 如果多个中间件,调用顺序如何?(代码演示)

func Log(c *gin.Context) {     fmt.Println("log middleware sample req begin")     c.Next()     fmt.Println("log middleware sample rsp finish") }  func Cost(c *gin.Context) {     now := time.Now()     fmt.Printf("ReqTimeBegin: %vn", now)     c.Next()     fmt.Printf("cost: %vn", time.Now().Sub(now)) }  //C userGrp.POST("/infos", Cost, Log, NewUser)

WEB篇·第3章·作业

7. Gin终止其中一个中间件,要如何做?

通过c.Abort()即可。

8. 如何优雅退出Gin的程序

Gin的启动通过子goroutine,并在主goroutine中通过监控退出信号来达到Gin程序的退出。

package main  import (     "context"     "log"     "os"     "os/signal"     "syscall"     "time"      "github.com/gin-gonic/gin" )  func main() {     r := gin.Default()      r.GET("/notify/signal/shutdown", func(c *gin.Context) {         time.Sleep(5 * time.Second)         c.String(http.StatusOK, "Test notify signal to shutdown server !")     })      go func() {         r.Run()     }()      // 等待中断信号来优雅地关闭服务器,为关闭服务器操作设置一个5秒的超时     quit := make(chan os.Signal, 1) // 创建一个接收信号的通道      signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) // 此处不会阻塞     <-quit // 阻塞在此,当接收到上述两种信号时才会往下执行      log.Println("Server exited") }

9. 利用之前的Go语言学到的知识,可以总结出 一次请求处理的大体流程?

1)初始化gin引擎     Default()或New()差别在于是否在初始化时注册LoggerRecovery中间件  2)路由/路由组注册(中间件合并,基数树生成)     engine.RouterGroup.engine = engine指向1)中初始化的引擎     Group(relativePath string, handlers ...HandlerFunc)     或 POST/GET/DELETE(relativePath string, handlers ...HandlerFunc)等      对全局、路由组、单路由上注册的中间件进行合并     对不同method形成各自的基数树trees(切片/最多9棵)  3)启动引擎     解析服务地址和服务端口     创建Socket()     开始监听Accept()     有新链接,则派生goroutine进行服务         c := srv.newConn(rw)         go c.serve(connCtx)  4) 提供 handler.ServeHTTP(rw, req) 服务     上下文池子中取空闲 Context         engine.handleHTTPRequest(c)         解析method urlpath          根据path路由取得对应的注册的中间件链并执行         value := root.getValue(rPath, c.params, unescape)         if value.params != nil {             c.Params = *value.params         }         if value.handlers != nil {             c.handlers = value.handlers             c.fullPath = value.fullPath             c.Next()             c.writermem.WriteHeaderNow()             return         }  5) 服务处理完毕     归还Context     engine.pool.Put(c)

10. gin返回html的处理(选做)

11. gin如何处理静态文件(选做)

[TOC]

1. 介绍一下Gin

Gin是一个用golang开发的优秀的支持Restful风格的WEB框架。  优秀特性: 快速 -- 基于Radix树的路由,没有反射 中间件 -- 可扩展性高 Crash处理 -- 异常Recovery 路由组 -- 无限嵌套不影响性能 JSON -- 支持最常用的JSON请求解析 GIN渲染 -- 内置渲染

2. Defalut和New有什么不同

区别主要在于是否默认带有中间件:     Default构建的引擎默认带有LoggerRecovery两个中间件,能记录请求信息到日志,可以对异常Crash进行recovery处理。      New则不带任何中间件。

3. 针对表单做restful的处理

restful风格
使用HTTP方法(POST/GET/PUT/DELETE)去对应CRUD操作,“请求=动词+宾语”

restful表单处理示例:

package main  import (     "fmt"     "net/http"      "github.com/gin-gonic/gin" )  type User struct {     Name string `form:"name" binding:"required"`     Age  int    `form:"age" binding:"required"` }  func main() {      r := gin.Default()      userGrp := r.Group("/user")     {         //C         userGrp.POST("/infos", NewUser)         //R         userGrp.GET("/infos", GetUserList)         //U         userGrp.PUT("/infos/:id", UpdateUser)         //D         userGrp.DELETE("/infos/:id", DeleteUser)     }      r.Run() }  func DeleteUser(c *gin.Context) {     id := c.Param("id")     c.JSON(http.StatusOK, gin.H{         "msg":   "ok",         "infos": fmt.Sprintf("%s infos deleted!", id),     }) }  func UpdateUser(c *gin.Context) {     id := c.Param("id")     c.JSON(http.StatusOK, gin.H{         "msg":   "ok",         "infos": fmt.Sprintf("%s infos updated!", id),     }) }  func NewUser(c *gin.Context) {     user := new(User)     err := c.ShouldBind(&user)     if err != nil {         c.JSON(http.StatusBadRequest, gin.H{             "msg": err.Error(),         })         return     }     c.JSON(http.StatusOK, gin.H{         "msg":   "ok",         "infos": fmt.Sprintf("%s - %d", user.Name, user.Age),     })  }  func GetUserList(c *gin.Context) {     users := make([]User, 2)     users = []User{         {"usr01", 21},         {"usr02", 22},     }     c.JSON(http.StatusOK, gin.H{         "msg":   "ok",         "infos": users,     }) }

4. 针对JSON做restful的处理

type User struct {     Name string `binding:"required" json:"name"`     Age  int    `binding:"required" json:"age"` }  //C userGrp.POST("/infos", NewUser)  func NewUser(c *gin.Context) {     user := new(User)     err := c.ShouldBind(&user)     if err != nil {         c.JSON(http.StatusBadRequest, gin.H{             "msg": err.Error(),         })         return     }     c.JSON(http.StatusOK, gin.H{         "msg":   "ok",         "infos": fmt.Sprintf("%s - %d", user.Name, user.Age),     }) }

5. 举例如何用到中间件

// 一个耗时计算中间件示例 // 1) 中间件定义 func Cost(c *gin.Context){     now := time.Now()     c.Next()     fmt.Printf("cost: %vn", time.Now().Sub(now)) }  // 2) 中间件注册 //C userGrp.POST("/infos", Cost, NewUser)

6. 如果多个中间件,调用顺序如何?(代码演示)

func Log(c *gin.Context) {     fmt.Println("log middleware sample req begin")     c.Next()     fmt.Println("log middleware sample rsp finish") }  func Cost(c *gin.Context) {     now := time.Now()     fmt.Printf("ReqTimeBegin: %vn", now)     c.Next()     fmt.Printf("cost: %vn", time.Now().Sub(now)) }  //C userGrp.POST("/infos", Cost, Log, NewUser)

WEB篇·第3章·作业

7. Gin终止其中一个中间件,要如何做?

通过c.Abort()即可。

8. 如何优雅退出Gin的程序

Gin的启动通过子goroutine,并在主goroutine中通过监控退出信号来达到Gin程序的退出。

package main  import (     "context"     "log"     "os"     "os/signal"     "syscall"     "time"      "github.com/gin-gonic/gin" )  func main() {     r := gin.Default()      r.GET("/notify/signal/shutdown", func(c *gin.Context) {         time.Sleep(5 * time.Second)         c.String(http.StatusOK, "Test notify signal to shutdown server !")     })      go func() {         r.Run()     }()      // 等待中断信号来优雅地关闭服务器,为关闭服务器操作设置一个5秒的超时     quit := make(chan os.Signal, 1) // 创建一个接收信号的通道      signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) // 此处不会阻塞     <-quit // 阻塞在此,当接收到上述两种信号时才会往下执行      log.Println("Server exited") }

9. 利用之前的Go语言学到的知识,可以总结出 一次请求处理的大体流程?

1)初始化gin引擎     Default()或New()差别在于是否在初始化时注册LoggerRecovery中间件  2)路由/路由组注册(中间件合并,基数树生成)     engine.RouterGroup.engine = engine指向1)中初始化的引擎     Group(relativePath string, handlers ...HandlerFunc)     或 POST/GET/DELETE(relativePath string, handlers ...HandlerFunc)等      对全局、路由组、单路由上注册的中间件进行合并     对不同method形成各自的基数树trees(切片/最多9棵)  3)启动引擎     解析服务地址和服务端口     创建Socket()     开始监听Accept()     有新链接,则派生goroutine进行服务         c := srv.newConn(rw)         go c.serve(connCtx)  4) 提供 handler.ServeHTTP(rw, req) 服务     上下文池子中取空闲 Context         engine.handleHTTPRequest(c)         解析method urlpath          根据path路由取得对应的注册的中间件链并执行         value := root.getValue(rPath, c.params, unescape)         if value.params != nil {             c.Params = *value.params         }         if value.handlers != nil {             c.handlers = value.handlers             c.fullPath = value.fullPath             c.Next()             c.writermem.WriteHeaderNow()             return         }  5) 服务处理完毕     归还Context     engine.pool.Put(c)

10. gin返回html的处理(选做)

11. gin如何处理静态文件(选做)

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » WEB篇·第3章·作业求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们