![61396-Go語(yǔ)言程序設(shè)計(jì)項(xiàng)目化教程(微課版)7.2 路由_第1頁(yè)](http://file4.renrendoc.com/view12/M05/16/07/wKhkGWXdxXSASEG1AAEFDQfV1w8534.jpg)
![61396-Go語(yǔ)言程序設(shè)計(jì)項(xiàng)目化教程(微課版)7.2 路由_第2頁(yè)](http://file4.renrendoc.com/view12/M05/16/07/wKhkGWXdxXSASEG1AAEFDQfV1w85342.jpg)
![61396-Go語(yǔ)言程序設(shè)計(jì)項(xiàng)目化教程(微課版)7.2 路由_第3頁(yè)](http://file4.renrendoc.com/view12/M05/16/07/wKhkGWXdxXSASEG1AAEFDQfV1w85343.jpg)
![61396-Go語(yǔ)言程序設(shè)計(jì)項(xiàng)目化教程(微課版)7.2 路由_第4頁(yè)](http://file4.renrendoc.com/view12/M05/16/07/wKhkGWXdxXSASEG1AAEFDQfV1w85344.jpg)
![61396-Go語(yǔ)言程序設(shè)計(jì)項(xiàng)目化教程(微課版)7.2 路由_第5頁(yè)](http://file4.renrendoc.com/view12/M05/16/07/wKhkGWXdxXSASEG1AAEFDQfV1w85345.jpg)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
路由路由的分組路由的多種數(shù)據(jù)格式響應(yīng)路由的拆分與注冊(cè)01.03.02.目錄URL重定向04.01路由的分組路由分組定義路由分組使用1路由的分組/login/user1/login/admin/logout/user1/logout/admin將具有一類(lèi)功能的路由放到一起通常也會(huì)將不同版本的路由分成一個(gè)組路由分組的定義將具有一類(lèi)功能的路由放到一起通常也會(huì)將不同版本的路由分成一個(gè)組常見(jiàn)應(yīng)用:首頁(yè)路由組、用戶路由組、后臺(tái)管理路由組等路由分組的使用/login/username/logout/username1路由的分組homePageRouters:=r.Group("/"){homePageRouters.GET("/",func(c*gin.Context)){c.string(200,"首頁(yè)")}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,"商品分類(lèi)")}}設(shè)置首頁(yè)路由組為/組內(nèi)包含首頁(yè)、登錄、登出、商品分類(lèi)02路由的拆分與注冊(cè)路由的拆分路由的注冊(cè)2路由的拆分與注冊(cè)原目錄結(jié)構(gòu)路由拆分后目錄結(jié)構(gòu)gin_demo├──go.mod├──go.sum├──main.go└──routers.gogin_demo├──go.mod├──go.sum├──main.go└──routers└──routers.go把路由拆分成單獨(dú)的文件或包即:拆分成多個(gè)文件路由的拆分將main.go文件中路由部分的代碼拆分出來(lái),形成單獨(dú)的文件或包。從而避免當(dāng)項(xiàng)目規(guī)模增大后,main.go文件代碼過(guò)于龐大路由的拆分的使用路由的注冊(cè)不管拆分的路由還是沒(méi)拆分的路由,路由的注冊(cè)方式都是一樣的:需要在文件中注冊(cè)路由,供main.go去調(diào)用。2路由的拆分與注冊(cè)routes/A.gofuncA(r*gin.Engine){ r.GET("/he1",he1Handler) r.GET("/load1",load1Handler) //...}routes/B.gofuncB(r*gin.Engine){ r.GET("/he2",he2Handler) r.GET("/load2",load2Handler) //...}main.go文件funcmain(){ r:=gin.Default() routers.A(r) routers.B(r)…… r.Run();}路由拆分成多個(gè)文件2路由的拆分與注冊(cè)app/blog/router.gofuncRouters(e*gin.Engine){e.GET("/post",postHandler)e.GET("/comment",commentHandler)}app/shop/router.gofuncRouters(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路由的拆分與注冊(cè)main.gofuncmain(){//加載多個(gè)APP的路由配置
routers.Include(shop.Routers,blog.Routers)//初始化路由
r:=routers.Init()iferr:=r.Run();err!=nil{//...}}routes/routes.gotypeOptionfunc(*gin.Engine)varoptions=[]Option{}//注冊(cè)app的路由配置funcInclude(opts...Option){options=append(options,opts...)}//初始化funcInit()*gin.Engine{r:=gin.New()for_,opt:=rangeoptions{opt(r)}returnr}路由拆分到不同的APP03路由的多種數(shù)據(jù)格式響應(yīng)JSON格式XML格式HTML模板渲染3路由的多種數(shù)據(jù)格式響應(yīng)//JSONserializesthegivenstructasJSONintotheresponsebody.//ItalsosetstheContent-Typeas"application/json".func(c*Context)JSON(codeint,objany){ c.Render(code,render.JSON{Data:obj})}JSON渲染gin.H類(lèi)型//Hisashortcutformap[string]interface{}typeHmap[string]anyRestful風(fēng)格的API所輸出的大多都是JSON格式的內(nèi)容相比較舊的XML格式,JSON格式輕便、簡(jiǎn)潔、易于傳輸使用了gin.H類(lèi)型來(lái)構(gòu)建了一個(gè)鍵值對(duì)對(duì)象3路由的多種數(shù)據(jù)格式響應(yīng)packagemainimport( "/gin-gonic/gin")funcmain(){ //創(chuàng)建基礎(chǔ)路由,賦值變量r r:=gin.Default() //使用GET請(qǐng)求
r.GET("/JSON",func(c*gin.Context){ c.JSON(200,gin.H{"name":"Gin","city":"深圳"}) }) //調(diào)用Run函數(shù),監(jiān)聽(tīng)8080端口
r.Run(":8080")}JSON全拼是JavaScriptObjectNotationJSON使用Javascript語(yǔ)法來(lái)描述數(shù)據(jù)對(duì)象,但是JSON獨(dú)立于語(yǔ)言和平臺(tái)JSON類(lèi)似XML,但比XML更小、更快,更易解析、易于人閱讀和編寫(xiě)3路由的多種數(shù)據(jù)格式響應(yīng)funcmain(){//創(chuàng)建基礎(chǔ)路由,賦值變量rr:=gin.Default()//使用GET請(qǐng)求
r.GET("/JSON",func(c*gin.Context){ c.JSON(200,Person{Name:"Gin",City:"深圳",Age:18}) c.JSON(200,student{stuno:"123",stuname:"Go"})})//調(diào)用Run函數(shù),監(jiān)聽(tīng)8080端口
r.Run(":8080")}packagemainimport( "/gin-gonic/gin")typePersonstruct{ Namestring Citystring Ageint8}typestudentstruct{ stunostring stunamestring}struct轉(zhuǎn)JSON需要注意:結(jié)構(gòu)體類(lèi)型名、字段名首字母要大寫(xiě)3路由的多種數(shù)據(jù)格式響應(yīng)packagemainimport"/gin-gonic/gin"typePersonstruct{ Namestring`json:"name"` Citystring`json:"city"` Ageint8`json:"age"`}funcmain(){ //創(chuàng)建基礎(chǔ)路由,賦值變量r r:=gin.Default() //使用GET請(qǐng)求
r.GET("/JSON",func(c*gin.Context){ allPerson:=[]Person{{Name:"Gin",City:"深圳",Age:18},{Name:"Go",City:"廣東",Age:20}} c.JSON(200,allPerson) }) //調(diào)用Run函數(shù),監(jiān)聽(tīng)8080端口
r.Run(":8080")}JSON數(shù)組配合jsontag可以實(shí)現(xiàn)自定義名稱(chēng)3路由的多種數(shù)據(jù)格式響應(yīng)//XMLserializesthegivenstructasXMLintotheresponsebody.//ItalsosetstheContent-Typeas"application/xml".func(c*Context)XML(codeint,objany){ c.Render(code,render.XML{Data:obj})}XML渲染XML//XMLcontainsthegiveninterfaceobject.typeXMLstruct{ Dataany}XML(eXtensibleMarkupLanguage)XML指可擴(kuò)展標(biāo)記語(yǔ)言XML被設(shè)計(jì)用來(lái)傳輸和存儲(chǔ)數(shù)據(jù)XML不用于表現(xiàn)和展示數(shù)據(jù)HTML則用來(lái)表現(xiàn)數(shù)據(jù)3路由的多種數(shù)據(jù)格式響應(yīng)packagemainimport( "/gin-gonic/gin")funcmain(){ //創(chuàng)建基礎(chǔ)路由,賦值變量r r:=gin.Default() //使用GET請(qǐng)求
r.GET("/XML",func(c*gin.Context){ c.XML(200,gin.H{"name":"Gin","city":"深圳"}) }) //調(diào)用Run函數(shù),監(jiān)聽(tīng)8080端口
r.Run(":8080")}XML標(biāo)簽必須成對(duì)出現(xiàn)(即有開(kāi)始標(biāo)簽——結(jié)束標(biāo)簽)在瀏覽器地址欄的url前加上view-source:前綴可以用來(lái)查看頁(yè)面源碼3路由的多種數(shù)據(jù)格式響應(yīng)packagemainimport"/gin-gonic/gin"typePersonstruct{ Namestring`xml:"name"` Citystring`xml:"city"` Ageint8`xml:"age"`}funcmain(){ //創(chuàng)建基礎(chǔ)路由,賦值變量r r:=gin.Default() //使用GET請(qǐng)求
r.GET("/XML",func(c*gin.Context){ c.XML(200,Person{Name:"Gin",City:"深圳",Age:18}) }) //調(diào)用Run函數(shù),監(jiān)聽(tīng)8080端口
r.Run(":8080")}struct轉(zhuǎn)XMLGin設(shè)計(jì)了字段重命名的功能(即自定義節(jié)點(diǎn)名字),在創(chuàng)建結(jié)構(gòu)體時(shí)給字段添加對(duì)應(yīng)tag即可3路由的多種數(shù)據(jù)格式響應(yīng)packagemainimport"/gin-gonic/gin"typePersonstruct{ Namestring`xml:"name"` Citystring`xml:"city"` Ageint8`xml:"age"`}funcmain(){ //創(chuàng)建基礎(chǔ)路由,賦值變量r r:=gin.Default() //使用GET請(qǐng)求
r.GET("/XML",func(c*gin.Context){ allPerson:=[]Person{{Name:"Gin",City:"深圳",Age:18},{Name:"Go",City:"廣東",Age:20}} c.XML(200,gin.H{"Person":allPerson}) }) //調(diào)用Run函數(shù),監(jiān)聽(tīng)8080端口
r.Run(":8080")}XML數(shù)組XML必須要有一個(gè)根節(jié)點(diǎn)3路由的多種數(shù)據(jù)格式響應(yīng)1.解析HTML文件,創(chuàng)建DOM樹(shù)2.解析CSS,形成CSS對(duì)象模型3.將CSS與DOM合并,構(gòu)建渲染樹(shù)(renderingtree)4.進(jìn)行布局和繪制HTML網(wǎng)頁(yè)渲染過(guò)程Go語(yǔ)言內(nèi)置的html/template用于生成可對(duì)抗代碼注入的安全HTML文檔將多個(gè)頁(yè)面內(nèi)不變的部分提出來(lái)成為模版,而那些可變部分有后端程序提供數(shù)據(jù),借助模版引擎渲染來(lái)生成動(dòng)態(tài)網(wǎng)頁(yè)模板可以被理解為事先定義好的HTML文檔。模板渲染可以被簡(jiǎn)單理解為文本替換操作——是后端用相應(yīng)的數(shù)據(jù)去替換HTML文檔中事先準(zhǔn)備好的標(biāo)記3路由的多種數(shù)據(jù)格式響應(yīng)index1.html文件<!DOCTYPEhtml><html><head><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"><title>Document</title></head><body>{{.}}</body></html>template的語(yǔ)法之一:{{.}}這部分是需要通過(guò)go的template引擎進(jìn)行解析,然后替換成對(duì)應(yīng)的內(nèi)容3路由的多種數(shù)據(jù)格式響應(yīng)packagemainimport( "html/template" "net/http")functmpl(whttp.ResponseWriter,r*http.Request){ t1,err:=template.ParseFiles("E:/go/demo/index1.html") iferr!=nil{ panic(err) } t1.Execute(w,"Hellohtml/template!")}funcmain(){ http.HandleFunc("/",tmpl) http.ListenAndServe(":8080",nil)}使用template.ParseFiles("test.html"),它會(huì)自動(dòng)創(chuàng)建一個(gè)模板(關(guān)聯(lián)到變量t1上),并解析一個(gè)或多個(gè)文本文件(不僅僅是html文件);解析之后就可以使用Execute(w,"helloworld")去執(zhí)行解析后的模板對(duì)象,執(zhí)行過(guò)程是合并、替換的過(guò)程。3路由的多種數(shù)據(jù)格式響應(yīng)Gin實(shí)現(xiàn)HTML渲染與Go語(yǔ)言內(nèi)置的html/template類(lèi)似,先準(zhǔn)備一個(gè)index.html模板文件通過(guò)r.LoadHTMLFiles("html/index.html")可以加載這個(gè)模板文件使用c.HTML()函數(shù)調(diào)用packagemainimport( "/gin-gonic/gin" "net/http")funcmain(){ 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模板渲染!")//調(diào)用模板文件
}) r.Run()}3路由的多種數(shù)據(jù)格式響應(yīng)Gin實(shí)現(xiàn)HTML渲染之加載目錄r.LoadHTMLFiles()函數(shù)可以加載多個(gè)模板文件但當(dāng)有大量模板文件的時(shí)候,r.LoadHTMLFiles()函數(shù)就顯得略有不足Gin針對(duì)于此提供了LoadHTMLGlob()函數(shù),該函數(shù)可以高效地加載整個(gè)目錄下的所有模板index2.html文件<!DOCTYPEhtml><html><head><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"><title>Do
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年債權(quán)管理與轉(zhuǎn)讓策劃合同樣本
- 2025年企業(yè)供應(yīng)鏈物流外包項(xiàng)目協(xié)議
- 2025年債權(quán)讓與四方合同策劃范本
- 2025年倉(cāng)庫(kù)管理員職責(zé)與待遇合同
- 2025年具有法律效力的個(gè)人投資對(duì)賭協(xié)議
- 2025年電子點(diǎn)火沼氣燈項(xiàng)目申請(qǐng)報(bào)告模范
- 2025年熱熔膠膠粉及膠粒項(xiàng)目規(guī)劃申請(qǐng)報(bào)告模范
- 2025年雙方教育合作框架協(xié)議
- 2025年冬季社會(huì)實(shí)踐活動(dòng)協(xié)議范本
- 2025年教育實(shí)踐基地聯(lián)盟發(fā)展與協(xié)作策劃協(xié)議
- 糾正冤假錯(cuò)案申訴范文
- 鋰離子電池串并聯(lián)成組優(yōu)化研究
- 人教版小學(xué)數(shù)學(xué)一年級(jí)下冊(cè)第1-4單元教材分析
- JTS-215-2018碼頭結(jié)構(gòu)施工規(guī)范
- 大酒店風(fēng)險(xiǎn)分級(jí)管控和隱患排查治理雙體系文件
- 財(cái)務(wù)實(shí)習(xí)生合同
- 2024年湘潭醫(yī)衛(wèi)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)含答案
- 2024年長(zhǎng)沙衛(wèi)生職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)含答案
- 地質(zhì)災(zāi)害危險(xiǎn)性評(píng)估的基本知識(shí)
- (正式版)SHT 3075-2024 石油化工鋼制壓力容器材料選用規(guī)范
- 重慶市2023年中考道德與法治試卷(A卷)(附真題答案)
評(píng)論
0/150
提交評(píng)論