61396-Go语言程序设计项目化教程(微课版)7.2 路由.pptx
路由路由路由的分组路由的多种数据格式响应路由的拆分与注册01.03.02.目录URL重定向04.01路由的分组路由分组定义路由分组使用1路由的分组路由的分组/login/user1/login/admin/logout/user1/logout/admin将具有一类功能的路由放到一起通常也会将不同版本的路由分成一个组路由分组的定义将具有一类功能的路由放到一起通常也会将不同版本的路由分成一个组常见应用:首页路由组、用户路由组、后台管理路由组等路由分组的使用/login/username/logout/username1路由的分组路由的分组homePageRouters:=r.Group(/)homePageRouters.GET(/,func(c*gin.Context)c.string(200,首页)homePageRouters.GET(/login,func(c*gin.Context)c.string(200,登录)homePageRouters.GET(/logout,func(c*gin.Context)c.string(200,登出)homePageRouters.GET(/Commodityclassification,func(c*gin.Context)c.string(200,商品分类)设置首页路由组为/组内包含首页、登录、登出、商品分类02路由的拆分与注册路由的拆分路由的注册2路由的拆分与注册路由的拆分与注册原目录结构路由拆分后目录结构gin_demo go.mod go.sum main.go routers.gogin_demo go.mod go.sum main.go routers routers.go把路由拆分成单独的文件或包即:拆分成多个文件路由的拆分将main.go文件中路由部分的代码拆分出来,形成单独的文件或包。从而避免当项目规模增大后,main.go文件代码过于庞大路由的拆分的使用路由的注册不管拆分的路由还是没拆分的路由,路由的注册方式都是一样的:需要在文件中注册路由,供main.go去调用。2路由的拆分与注册路由的拆分与注册routes/A.gofunc A(r*gin.Engine)r.GET(/he1,he1Handler)r.GET(/load1,load1Handler)/.routes/B.gofunc B(r*gin.Engine)r.GET(/he2,he2Handler)r.GET(/load2,load2Handler)/.main.go文件func main()r:=gin.Default()routers.A(r)routers.B(r)r.Run();路由拆分成多个文件2路由的拆分与注册路由的拆分与注册app/blog/router.gofunc Routers(e*gin.Engine)e.GET(/post,postHandler)e.GET(/comment,commentHandler)app/shop/router.gofunc Routers(e*gin.Engine)e.GET(/goods,goodsHandler)e.GET(/checkout,checkoutHandler)gin_demo app blog handler.go router.go shop handler.go router.go go.mod go.sum main.go routers routers.go 路由拆分到不同的APP2路由的拆分与注册路由的拆分与注册main.gofunc main()/加载多个APP的路由配置 routers.Include(shop.Routers,blog.Routers)/初始化路由 r:=routers.Init()if err:=r.Run();err!=nil /.routes/routes.gotype Option func(*gin.Engine)var options=Option/注册app的路由配置func Include(opts.Option)options=append(options,opts.)/初始化func Init()*gin.Engine r:=gin.New()for _,opt:=range options opt(r)return r 路由拆分到不同的APP03路由的多种数据格式响应JSON格式XML格式HTML模板渲染3路由的多种数据格式响应路由的多种数据格式响应/JSON serializes the given struct as JSON into the response body./It also sets the Content-Type as application/json.func(c*Context)JSON(code int,obj any)c.Render(code,render.JSONData:obj)JSON渲染gin.H类型/H is a shortcut for mapstringinterfacetype H mapstringanyRestful风格的API所输出的大多都是JSON格式的内容相比较旧的XML格式,JSON格式轻便、简洁、易于传输使用了gin.H类型来构建了一个键值对对象3路由的多种数据格式响应路由的多种数据格式响应package mainimport( main()/创建基础路由,赋值变量rr:=gin.Default()/使用GET请求r.GET(/JSON,func(c*gin.Context)c.JSON(200,gin.Hname:Gin,city:深圳)/调用Run函数,监听8080端口r.Run(:8080)JSON 全拼是JavaScript Object NotationJSON 使用 Javascript语法来描述数据对象,但是 JSON 独立于语言和平台JSON 类似 XML,但比 XML 更小、更快,更易解析、易于人阅读和编写3路由的多种数据格式响应路由的多种数据格式响应func main()/创建基础路由,赋值变量r r:=gin.Default()/使用GET请求 r.GET(/JSON,func(c*gin.Context)c.JSON(200,PersonName:Gin,City:深圳,Age:18)c.JSON(200,studentstuno:123,stuname:Go)/调用Run函数,监听8080端口 r.Run(:8080)package mainimport( Person struct Name stringCity stringAge int8type student struct stuno stringstuname stringstruct转JSON 需要注意:结构体类型名、字段名首字母要大写3路由的多种数据格式响应路由的多种数据格式响应package mainimport Person struct Name string json:nameCity string json:cityAge int8 json:agefunc main()/创建基础路由,赋值变量rr:=gin.Default()/使用GET请求r.GET(/JSON,func(c*gin.Context)allPerson:=PersonName:Gin,City:深圳,Age:18,Name:Go,City:广东,Age:20c.JSON(200,allPerson)/调用Run函数,监听8080端口r.Run(:8080)JSON数组配合json tag可以实现自定义名称3路由的多种数据格式响应路由的多种数据格式响应/XML serializes the given struct as XML into the response body./It also sets the Content-Type as application/xml.func(c*Context)XML(code int,obj any)c.Render(code,render.XMLData:obj)XML渲染XML/XML contains the given interface object.type XML struct Data anyXML(eXtensible Markup Language)XML指可扩展标记语言XML 被设计用来传输和存储数据XML不用于表现和展示数据HTML 则用来表现数据3路由的多种数据格式响应路由的多种数据格式响应package mainimport( main()/创建基础路由,赋值变量rr:=gin.Default()/使用GET请求r.GET(/XML,func(c*gin.Context)c.XML(200,gin.Hname:Gin,city:深圳)/调用Run函数,监听8080端口r.Run(:8080)XML标签必须成对出现(即有开始标签结束标签)在浏览器地址栏的url前加上view-source:前缀可以用来查看页面源码3路由的多种数据格式响应路由的多种数据格式响应package mainimport Person struct Name string xml:nameCity string xml:cityAge int8 xml:agefunc main()/创建基础路由,赋值变量rr:=gin.Default()/使用GET请求r.GET(/XML,func(c*gin.Context)c.XML(200,PersonName:Gin,City:深圳,Age:18)/调用Run函数,监听8080端口r.Run(:8080)struct转XMLGin设计了字段重命名的功能(即自定义节点名字),在创建结构体时给字段添加对应tag即可3路由的多种数据格式响应路由的多种数据格式响应package mainimport Person struct Name string xml:nameCity string xml:cityAge int8 xml:agefunc main()/创建基础路由,赋值变量rr:=gin.Default()/使用GET请求r.GET(/XML,func(c*gin.Context)allPerson:=PersonName:Gin,City:深圳,Age:18,Name:Go,City:广东,Age:20c.XML(200,gin.HPerson:allPerson)/调用Run函数,监听8080端口r.Run(:8080)XML数组XML必须要有一个根节点3路由的多种数据格式响应路由的多种数据格式响应1.解析HTML文件,创建DOM树2.解析CSS,形成CSS对象模型3.将CSS与DOM合并,构建渲染树(renderingtree)4.进行布局和绘制HTML网页渲染过程Go语言内置的html/template用于生成可对抗代码注入的安全HTML文档将多个页面内不变的部分提出来成为模版,而那些可变部分有后端程序提供数据,借助模版引擎渲染来生成动态网页模板可以被理解为事先定义好的HTML文档。模板渲染可以被简单理解为文本替换操作是后端用相应的数据去替换HTML文档中事先准备好的标记3路由的多种数据格式响应路由的多种数据格式响应index1.html文件 Document .template的语法之一:.这部分是需要通过go的template引擎进行解析,然后替换成对应的内容3路由的多种数据格式响应路由的多种数据格式响应package mainimport(html/templatenet/http)func tmpl(w http.ResponseWriter,r*http.Request)t1,err:=template.ParseFiles(E:/go/demo/index1.html)if err!=nil panic(err)t1.Execute(w,Hello html/template!)func main()http.HandleFunc(/,tmpl)http.ListenAndServe(:8080,nil)使用template.ParseFiles(test.html),它会自动创建一个模板(关联到变量t1上),并解析一个或多个文本文件(不仅仅是html文件);解析之后就可以使用Execute(w,hello world)去执行解析后的模板对象,执行过程是合并、替换的过程。3路由的多种数据格式响应路由的多种数据格式响应Gin实现HTML渲染与Go语言内置的html/template类似,先准备一个index.html模板文件通过r.LoadHTMLFiles(html/index.html)可以加载这个模板文件使用c.HTML()函数调用package mainimport( main()r:=gin.Default()r.LoadHTMLFiles(E:/go/demo/index1.html)/加载模板文件r.GET(/,func(c*gin.Context)c.HTML(http.StatusOK,index1.html,Hello,Gin-HTML模板渲染!)/调用模板文件)r.Run()3路由的多种数据格式响应路由的多种数据格式响应Gin实现HTML渲染之加载目录r.LoadHTMLFiles()函数可以加载多个模板文件但当有大量模板文件的时候,r.LoadHTMLFiles()函数就显得略有不足Gin针对于此提供了LoadHTMLGlob()函数,该函数可以高效地加载整个目录下的所有模板index2.html文件 Document .body package mainimport( main()r:=gin.Default()r.LoadHTMLGlob(E:/go/demo/*)/加载目录下的所有模板文件r.GET(/,func(c*gin.Context)c.HTML(http.StatusOK,index2.html,gin.Hbody:Gin-HTML模板渲染,)r.Run()LoadHTMLGlob()函数还支持对子目录的读取,即模板文件夹下存在子文件夹的时候,可以用*号来读取r.LoadHTMLGlob(html/*/*)表示加载html目录下所有子目录中的模板文件3路由的多种数据格式响应路由的多种数据格式响应04URL重定向URL重定向概念Gin重定向的使用4URLURL重定向重定向 URL 重定向,也称为 URL 转发,是一种当实际资源,如单个页面、表单或者整个 Web 应用被迁移到新的 URL 下的时候,保持(原有)链接可用的技术。HTTP 协议提供了一种特殊形式的响应 HTTP 重定向(HTTP redirects)来执行此类操作。重定向可实现许多目标:URL重定向概念站点维护或停机期间的临时重定向。永久重定向将在更改站点的 URL,上传文件时的进度页等之后保留现有的链接/书签。上传文件时的表示进度的页面。Gin重定向的使用r.GET(/test,func(c*gin.Context)c.Redirect(http.StatusMovedPermanently,http:/