网站空间多大合适wordpress+仿简书模板

pingmian/2026/1/21 14:41:44/文章来源:
网站空间多大合适,wordpress+仿简书模板,标题优化seo,南宁网站建设q479185700惠文章目录 一、Gin框架介绍二、RESTful API三、Gin渲染1. HTML渲染2. 自定义模板函数3. 静态文件处理4. 使用模板继承5. 补充文件路径处理6. JSON渲染7. XML渲染8. YMAL渲染9. protobuf渲染 四、Gin获取各种方式传递过来的参数1、获取querystring参数2、获取form参数3、获取path… 文章目录 一、Gin框架介绍二、RESTful API三、Gin渲染1. HTML渲染2. 自定义模板函数3. 静态文件处理4. 使用模板继承5. 补充文件路径处理6. JSON渲染7. XML渲染8. YMAL渲染9. protobuf渲染 四、Gin获取各种方式传递过来的参数1、获取querystring参数2、获取form参数3、获取path参数 三、参数绑定四、文件上传1、单个文件上传2、多个文件上传 五、Gin中间件六、重定向1. HTTP重定向2. 路由重定向 七、Gin路由1. 普通路由2. 路由组 一、Gin框架介绍 Gin是基于httprouter开发的Web框架,也是当前Go世界里最流行的Web框架。 Gin框架安装与使用 下载并安装Gin: go get -u github.com/gin-gonic/gin第一个Gin示例 package mainimport (github.com/gin-gonic/gin )func main() {// 创建一个默认的路由引擎r : gin.Default()// GET请求方式/hello请求的路径// 当客户端以GET方法请求/hello路径时会执行后面的匿名函数r.GET(/hello, func(c *gin.Context) {// c.JSON返回JSON格式的数据c.JSON(200, gin.H{message: Hello world!,})})// 启动HTTP服务默认在0.0.0.0:8080启动服务r.Run() }将上面的代码保存并编译执行然后使用浏览器打开127.0.0.1:8080/hello就能看到一串JSON字符串。 二、RESTful API REST与技术无关代表的是一种软件架构风格REST是Representational State Transfer的简称中文翻译为“表征状态转移”或“表现层状态转化”。 简单来说REST的含义就是客户端与Web服务器之间进行交互的时候使用HTTP协议中的4个请求方法代表不同的动作。 GET用来获取资源 POST用来新建资源 PUT用来更新资源 DELETE用来删除资源。 只要API程序遵循了REST风格那就可以称其为RESTful API。目前在前后端分离的架构中前后端基本都是通过RESTful API来进行交互。 例如我们现在要编写一个管理书籍的系统我们可以查询对一本书进行查询、创建、更新和删除等操作我们在编写程序的时候就要设计客户端浏览器与我们Web服务端交互的方式和路径。按照经验我们通常会设计成如下模式 请求方法URL含义GET/book查询书籍信息POST/create_book创建书籍记录POST/update_book更新书籍信息POST/delete_book删除书籍信息 同样的需求我们按照RESTful API设计如下 请求方法URL含义GET/book查询书籍信息POST/book创建书籍记录Put/book更新书籍信息Delete/book删除书籍信息 Gin框架支持开发RESTful API的开发。 func main() {r : gin.Default()r.GET(/book, func(c *gin.Context) {c.JSON(200, gin.H{message: GET,})})r.POST(/book, func(c *gin.Context) {c.JSON(200, gin.H{message: POST,})})r.PUT(/book, func(c *gin.Context) {c.JSON(200, gin.H{message: PUT,})})r.DELETE(/book, func(c *gin.Context) {c.JSON(200, gin.H{message: DELETE,})}) }此外还有一个可以匹配所有请求方法的Any方法如下 r.Any(/test, func(c *gin.Context) {...})为没有配置处理函数的路由添加处理程序默认情况下它返回404代码下面的代码为没有匹配到路由的请求都返回views/404.html页面。 r.NoRoute(func(c *gin.Context) {c.HTML(http.StatusNotFound, views/404.html, nil)})开发RESTful API的时候我们通常使用Postman来作为客户端的测试工具。 三、Gin渲染 1. HTML渲染 我们首先定义一个存放模板文件的templates文件夹然后在其内部按照业务分别定义一个posts文件夹和一个users文件夹。 posts/index.html文件的内容如下 {{define posts/index.html}} !DOCTYPE html html langenheadmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0meta http-equivX-UA-Compatible contentieedgetitleposts/index/title /head body{{.title}} /body /html {{end}}users/index.html文件的内容如下 {{define users/index.html}} !DOCTYPE html html langen headmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0meta http-equivX-UA-Compatible contentieedgetitleusers/index/title /head body{{.title}} /body /html {{end}}Gin框架中使用LoadHTMLGlob()或者LoadHTMLFiles()方法进行HTML模板渲染。 func main() {r : gin.Default()r.LoadHTMLGlob(43-gin-demo/templates/**/*)//r.LoadHTMLFiles(templates/posts/index.html, templates/users/index.html)r.GET(/posts/index, func(c *gin.Context) {c.HTML(http.StatusOK, posts/index.html, gin.H{title: posts/index,})})r.GET(users/index, func(c *gin.Context) {c.HTML(http.StatusOK, users/index.html, gin.H{title: users/index,})})r.Run(:8080) }启动后访问如下 2. 自定义模板函数 定义一个不转义相应内容的safe模板函数如下 func main() {router : gin.Default()router.SetFuncMap(template.FuncMap{safe: func(str string) template.HTML{return template.HTML(str)},})router.LoadHTMLFiles(./index.tmpl)router.GET(/index, func(c *gin.Context) {c.HTML(http.StatusOK, index.tmpl, a hrefhttps://www.baidu.com百度官方网址/a)})router.Run(:8080) }在index.tmpl中使用定义好的safe模板函数 !DOCTYPE html html langzh-CN headtitle修改模板引擎的标识符/title /head body div{{ . | safe }}/div /body /html启动后访问 3. 静态文件处理 当我们渲染的HTML文件中引用了静态文件时我们只需要按照以下方式在渲染页面前调用gin.Static方法即可。 func main() {r : gin.Default()r.Static(/static, ./static)r.LoadHTMLGlob(templates/**/*)// ...r.Run(:8080) }4. 使用模板继承 Gin框架默认都是使用单模板如果需要使用block template功能可以通过github.com/gin-contrib/multitemplate库实现具体示例如下 首先假设我们项目目录下的templates文件夹下有以下模板文件其中home.tmpl和index.tmpl继承了base.tmpl templates ├── includes │ ├── home.tmpl │ └── index.tmpl ├── layouts │ └── base.tmpl └── scripts.tmpl然后我们定义一个loadTemplates函数如下 func loadTemplates(templatesDir string) multitemplate.Renderer {r : multitemplate.NewRenderer()layouts, err : filepath.Glob(templatesDir /layouts/*.tmpl)if err ! nil {panic(err.Error())}includes, err : filepath.Glob(templatesDir /includes/*.tmpl)if err ! nil {panic(err.Error())}// 为layouts/和includes/目录生成 templates mapfor _, include : range includes {layoutCopy : make([]string, len(layouts))copy(layoutCopy, layouts)files : append(layoutCopy, include)r.AddFromFiles(filepath.Base(include), files...)}return r }我们在main函数中 func indexFunc(c *gin.Context){c.HTML(http.StatusOK, index.tmpl, nil) }func homeFunc(c *gin.Context){c.HTML(http.StatusOK, home.tmpl, nil) }func main(){r : gin.Default()r.HTMLRender loadTemplates(./templates)r.GET(/index, indexFunc)r.GET(/home, homeFunc)r.Run() }5. 补充文件路径处理 关于模板文件和静态文件的路径我们需要根据公司/项目的要求进行设置。可以使用下面的函数获取当前执行程序的路径。 func getCurrentPath() string {if ex, err : os.Executable(); err nil {return filepath.Dir(ex)}return ./ }6. JSON渲染 func main() {r : gin.Default()// gin.H 是map[string]interface{}的缩写r.GET(/someJSON, func(c *gin.Context) {// 方式一自己拼接JSONc.JSON(http.StatusOK, gin.H{message: Hello world!})})r.GET(/moreJSON, func(c *gin.Context) {// 方法二使用结构体var msg struct {Name string json:userMessage stringAge int}msg.Name 小王子msg.Message Hello world!msg.Age 18c.JSON(http.StatusOK, msg)})r.Run(:8080) }7. XML渲染 注意需要使用非匿名结构体类型。 func main() {r : gin.Default()// gin.H 是map[string]interface{}的缩写r.GET(/someXML, func(c *gin.Context) {// 方式一自己拼接JSONc.XML(http.StatusOK, gin.H{message: Hello world!})})r.GET(/moreXML, func(c *gin.Context) {// 方法二使用结构体type MessageRecord struct {Name stringMessage stringAge int}var msg MessageRecordmsg.Name 小王子msg.Message Hello world!msg.Age 18c.XML(http.StatusOK, msg)})r.Run(:8080) }8. YMAL渲染 r.GET(/someYAML, func(c *gin.Context) {c.YAML(http.StatusOK, gin.H{message: ok, status: http.StatusOK}) })9. protobuf渲染 r.GET(/someProtoBuf, func(c *gin.Context) {reps : []int64{int64(1), int64(2)}label : test// protobuf 的具体定义写在 testdata/protoexample 文件中。data : protoexample.Test{Label: label,Reps: reps,}// 请注意数据在响应中变为二进制数据// 将输出被 protoexample.Test protobuf 序列化了的数据c.ProtoBuf(http.StatusOK, data) })四、Gin获取各种方式传递过来的参数 1、获取querystring参数 querystring指的是URL中?后面携带的参数例如/user/search?usernamelymaddress北京。 获取请求的querystring参数的方法如下 func main() {//Default返回一个默认的路由引擎r : gin.Default()r.GET(/user/search, func(c *gin.Context) {// DefaultPostForm取不到值时会返回指定的默认值username : c.DefaultQuery(username, lym)//username : c.Query(username)address : c.Query(address)//输出json结果给调用方c.JSON(http.StatusOK, gin.H{message: ok,username: username,address: address,})})r.Run() }2、获取form参数 请求的数据通过form表单来提交例如向/user/search发送一个POST请求 获取请求数据的方式如下 func main() {//Default返回一个默认的路由引擎r : gin.Default()r.POST(/user/search, func(c *gin.Context) {// DefaultPostForm取不到值时会返回指定的默认值//username : c.DefaultPostForm(username, lym)username : c.PostForm(username)address : c.PostForm(address)//输出json结果给调用方c.JSON(http.StatusOK, gin.H{message: ok,username: username,address: address,})})r.Run(:8080) }3、获取path参数 请求的参数通过URL路径传递例如/user/search/lym/北京。 获取请求URL路径中的参数的方式如下。 func main() {//Default返回一个默认的路由引擎r : gin.Default()r.GET(/user/search/:username/:address, func(c *gin.Context) {username : c.Param(username)address : c.Param(address)//输出json结果给调用方c.JSON(http.StatusOK, gin.H{message: ok,username: username,address: address,})})r.Run(:8080) }三、参数绑定 为了能够更方便的获取请求相关参数提高开发效率我们可以基于请求的Content-Type识别请求数据类型并利用反射机制自动提取请求中QueryString、form表单、JSON、XML等参数到结构体中。 下面的示例代码演示了.ShouldBind()强大的功能它能够基于请求自动提取JSON、form表单和QueryString类型的数据并把值绑定到指定的结构体对象。 // Binding from JSON type Login struct {User string form:user json:user binding:requiredPassword string form:password json:password binding:required }func main() {router : gin.Default()// 绑定JSON的示例 ({user: lym, password: 123456})router.POST(/loginJSON, func(c *gin.Context) {var login Login// ShouldBind()会根据请求的Content-Type自行选择绑定器if err : c.ShouldBind(login); err nil {fmt.Printf(login info:%#v\n, login)c.JSON(http.StatusOK, gin.H{user: login.User,password: login.Password,})} else {c.JSON(http.StatusBadRequest, gin.H{error: err.Error()})}})// 绑定form表单示例 (userlympassword123456)router.POST(/loginForm, func(c *gin.Context) {var login Login// ShouldBind()会根据请求的Content-Type自行选择绑定器if err : c.ShouldBind(login); err nil {c.JSON(http.StatusOK, gin.H{user: login.User,password: login.Password,})} else {c.JSON(http.StatusBadRequest, gin.H{error: err.Error()})}})// 绑定QueryString示例 (/loginQuery?userq1mipassword123456)router.GET(/loginQuery, func(c *gin.Context) {var login Login// ShouldBind()会根据请求的Content-Type自行选择绑定器if err : c.ShouldBind(login); err nil {c.JSON(http.StatusOK, gin.H{user: login.User,password: login.Password,})} else {c.JSON(http.StatusBadRequest, gin.H{error: err.Error()})}})// Listen and serve on 0.0.0.0:8080router.Run(:8080) }ShouldBind会按照下面的顺序解析请求中的数据完成绑定 如果是 GET 请求只使用 Form 绑定引擎query。 如果是 POST 请求首先检查 content-type 是否为 JSON 或 XML然后再使用 Formform-data。 四、文件上传 1、单个文件上传 func main() {router : gin.Default()// 处理multipart forms提交文件时默认的内存限制是32 MiB// 可以通过下面的方式修改// router.MaxMultipartMemory 8 20 // 8 MiBrouter.POST(/upload, func(c *gin.Context) {// 单个文件file, err : c.FormFile(file)if err ! nil {c.JSON(http.StatusInternalServerError, gin.H{message: err.Error(),})return}log.Println(file.Filename)dst : fmt.Sprintf(C:/tmp/%s, file.Filename)// 上传文件到指定的目录c.SaveUploadedFile(file, dst)c.JSON(http.StatusOK, gin.H{message: fmt.Sprintf(%s uploaded!, file.Filename),})})router.Run() }2、多个文件上传 func main() {router : gin.Default()// 处理multipart forms提交文件时默认的内存限制是32 MiB// 可以通过下面的方式修改// router.MaxMultipartMemory 8 20 // 8 MiBrouter.POST(/upload, func(c *gin.Context) {// Multipart formform, _ : c.MultipartForm()files : form.File[file]for index, file : range files {log.Println(file.Filename)dst : fmt.Sprintf(C:/tmp/%s_%d, file.Filename, index)// 上传文件到指定的目录c.SaveUploadedFile(file, dst)}c.JSON(http.StatusOK, gin.H{message: fmt.Sprintf(%d files uploaded!, len(files)),})})router.Run() }五、Gin中间件 Gin框架允许开发者在处理请求的过程中加入用户自己的钩子Hook函数。这个钩子函数就叫中间件中间件适合处理一些公共的业务逻辑比如登录校验、日志打印、耗时统计等。 Gin中的中间件必须是一个gin.HandlerFunc类型。例如我们像下面的代码一样定义一个中间件。 // StatCost 是一个统计耗时请求耗时的中间件 func StatCost() gin.HandlerFunc {return func(c *gin.Context) {start : time.Now()c.Set(name, 小王子)// 执行其他中间件c.Next()// 计算耗时cost : time.Since(start)log.Println(cost)} }然后注册中间件的时候可以在全局注册。 func main() {// 新建一个没有任何默认中间件的路由r : gin.New()// 注册一个全局中间件r.Use(StatCost())r.GET(/test, func(c *gin.Context) {name : c.MustGet(name).(string)log.Println(name)c.JSON(http.StatusOK, gin.H{message: Hello world!,})})r.Run() }也可以给某个路由单独注册中间件。 // 给/test2路由单独注册中间件可注册多个r.GET(/test2, StatCost(), func(c *gin.Context) {name : c.MustGet(name).(string)log.Println(name)c.JSON(http.StatusOK, gin.H{message: Hello world!,})})六、重定向 1. HTTP重定向 HTTP 重定向很容易。内部、外部重定向均支持。 r.GET(/test, func(c *gin.Context) {c.Redirect(http.StatusMovedPermanently, http://www.sogo.com/) })2. 路由重定向 路由重定向使用HandleContext r.GET(/test, func(c *gin.Context) {// 指定重定向的URLc.Request.URL.Path /test2r.HandleContext(c) }) r.GET(/test2, func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{hello: world}) })七、Gin路由 1. 普通路由 r.GET(/index, func(c *gin.Context) {...}) r.GET(/login, func(c *gin.Context) {...}) r.POST(/login, func(c *gin.Context) {...})此外还有一个可以匹配所有请求方法的Any方法如下 r.Any(/test, func(c *gin.Context) {...})为没有配置处理函数的路由添加处理程序默认情况下它返回404代码下面的代码为没有匹配到路由的请求都返回views/404.html页面。 r.NoRoute(func(c *gin.Context) {c.HTML(http.StatusNotFound, views/404.html, nil)})2. 路由组 我们可以将拥有共同URL前缀的路由划分为一个路由组。习惯性一对{}包裹同组的路由这只是为了看着清晰你用不用{}包裹功能上没什么区别。 func main() {r : gin.Default()userGroup : r.Group(/user){userGroup.GET(/index, func(c *gin.Context) {...})userGroup.GET(/login, func(c *gin.Context) {...})userGroup.POST(/login, func(c *gin.Context) {...})}shopGroup : r.Group(/shop){shopGroup.GET(/index, func(c *gin.Context) {...})shopGroup.GET(/cart, func(c *gin.Context) {...})shopGroup.POST(/checkout, func(c *gin.Context) {...})}r.Run() }通常我们将路由分组用在划分业务逻辑或划分API版本时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/87137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电子商务网站建设 名词解释创建网站大约多少钱

一. 简介 JSDoc 3 是一个用于 JavaScript 的API文档生成器,类似于 Javadoc 或 phpDocumentor。可以将文档注释直接添加到源代码中。JSDoc 工具将扫描您的源代码并为您生成一个 HTML 文档网站。 JSDoc 是一种用于 JavaScript 代码文档注释的标记语言和工具。它不仅…

网站文字排版备案的网站建设书是什么

写入借鉴网址:好细的Vue安装与配置_vue配置-CSDN博客 下载Vue安装地址: Node.js — Download 查看是否安装成功: node -v npm -v 配置全局模式及缓存 结果通过: C:\Windows\system32>npm install vue -g added 20 packages …

私活网站开发多少钱福州seo网络推广

文章目录一、 简介二、 docker流程引擎部署2.1. jdk安装配置2.2. 下载打包好的tar包2.3. 上传tar包2.4. 在线安装Docker2.5. 检验安装是否成功三、tar转docker镜像3.1. 查看当前镜像3.2. 加载备份的flow-mysql.tar镜像文件3.3. 加载备份的flow-admin.tar镜像文件3.4. 加载备份的…

网页设计教程ppt封面图片技术优化seo

傅里叶级数和傅里叶变换 傅里叶变换,表示能将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。

福州做网站互联网公司有哪些集团网站建设费用

1、掌握SQL语言实现数据查询、定义、操纵、控制的关键字。 数据查询:使用SELECT关键字进行数据查询操作。数据定义:使用CREATE和ALTER关键字进行数据库、表、视图、索引等的定义操作。数据操纵:使用INSERT、DELETE和UPDATE关键字进行数据的插…

设计网站都有什么作用是什么原因保险网站大全

电脑自动关机功能在许多场景下非常实用,例如下载大文件后自动关机、长时间不使用电脑后自动关机以节省能源等。通过合理设置自动关机,可以提高电脑使用的便利性和节能效果。本文将介绍电脑自动关机怎么设置的三种方法,帮助您根据不同需求灵活…

网站设计需求两学一做登录网站

关于 Neting刚开始的时候是打算使用微软官方的 Yarp 库,实现一个 API 网关。目前写完了查看 Kubernetes Service 信息、创建 Route 和 Cluster 和绑定 Kubernetes Service。简单来说,就是完成了基础部分,配置路由和后端服务绑定,如…

重庆公司网站建设步骤谷歌wordpress优化

四次挥手 1)客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN1,其序列号为sequ(等于前已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN_WAIT_1&#xff08…

安全网站建设情况微信网页版文件传输助手

引言 C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。它在编程语言中具有举足轻重的地位。 此文为【C语言必知必会】系列第四篇,进行C语言顺序结构的专项练习,结合专题优质题目,带领读者从0开始&#xff0…

怎么样让网站正常解析老铁外链

责任链模式适用于需要将请求和处理解耦的场景,同时又需要动态地组织处理逻辑的场景。 通过使用责任链模式,可以实现请求的动态处理、灵活的扩展和简化的代码编写,提高系统的可维护性和可扩展性。 一、责任链入门 以下这是GPT生成的责任链代…

做网站的团队电子商务营销优势

什么是链表 离散,就是“分离的、散开的” 链表是什么样子的: 有限个节点离散分配 彼此间通过指针相连 除了首尾节点,每个节点都只有一个前驱节点和一个后继节点 首节点没有前驱结点,尾节点没有后继节点 基本概念术语&#xf…

医院网站建设 不足重庆设计网站

一. 简介 EF连接数据库有三种模式,分别是DBFirst、ModelFirst、CodeFirst,分别适用于不同的开发场景。 该章节,将主要介绍EF的DBFirst连接SQLServer数据库和MySql数据库两种操作方式 该模式在EF中出现的出现的最早,符合我们的传统…

ps做字幕模板下载网站网站每天更新的内容是内链吗

哈尔滨工业大学计算机专业创建于1956年,是中国最早的计算机专业之一。在1985年, 它又发展成计算机科学与工程系,并建立了计算机科学技术研究所。2000年,计算机科学与技术学院成立。同年,建立了软件学院,后经国家教育部、国家计委批…

电子商务网站开发费用调研报告图片制作在线生成器免费版

概述 在计算器科学与数学中,一个排序算法(英语:Sorting algorithm)是一种能将一串数据依照特定排序方式进行排列的一种算法。本文将总结几类常用的排序算法,包括冒泡排序、选择排序、插入排序、快速排序和归并排序&…

jsp网站开发实例与发布网络营销热门岗位

![1.png](https://ucc.alicdn.com/pic/developer-ecology/5dffeef22eb74645a35be2f60b5e54c6.png) 作者 | 亦盏 前言 随着微服务的流行,越来越多公司使用了微服务框架,微服务以其高内聚、低耦合等特性,提供了更好的容错性,也…

做网站网武昌做网站多少钱

序言 对于GPT-4我只是一个门外汉,至于我为什么要了解screenshot to code,只是因为我想知道,在我不懂前端设计的情况下,能不能通过一些工具辅助自己做一些简单的前端界面设计。如果你想通过此文深刻了解GPT-4或者该开源项目&#…

做网站链接怎么弄自己怎么设计公园

导读:知识图谱的构建技术主要有自顶向下和自底向上两种。其中自顶向下构建是指借助百科类网站等结构化数据源,从高质量数据中提取本体和模式信息,加入到知识库里。而自底向上构建,则是借助一定的技术手段,从公开采集的…

网站群建设规范定制开发小程序

一、环境空间的特点 环境空间是一种特殊类型的变量,它可以像其它变量一样被分配和操作,还可以以参数的形式传递给函数。 R语言中环境空间具有如下3个特点: 1、对象名称唯一性 此特点指的是在不同的环境空间中可以有同名的变量出现&#x…

正规的锦州网站建设新钥匙建站

Java面试题_2024新版Java高频面试题Java八股文面试真题 Java高频面试专题视频课程,瓤括了Java生态下的主流技术面试题,课程特色: 1、全面,jvm、并发编程、mysql、rabbitmq、spring、mybatis、redis、分布式、微服务、数据结构等等…

公司网站开发费计入什么科目定制旅游网站有哪些

近日,2020首届全国信创产业生态创新大赛颁奖盛典在北京信创园举办,霍因科技提交的“霍因科技-信创云统一存储和数据湖方案”荣获生态创新奖,这彰显了霍因科技在以数据存储技术推动信息技术应用创新产业方面的卓越成就。 据悉,首届…