当前位置: 首页 > news >正文

制作一个简单的网站树莓派下载wordpress

制作一个简单的网站,树莓派下载wordpress,滨州住房和城乡建设部网站,如何制作网页脚本GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Htt…GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Http) 11、GO学习之 微框架(Gin) 文章目录 GO系列前言一、Gin 简介二、Gin 框架搭建2.1 安装 Gin2.2 简单示例 三、路由和处理函数3.1 什么是路由3.2 Gin 框架中的路由及案例3.3 实际开发中的应用及优缺点 四、请求和响应处理4.1 接受参数4.2 处理请求4.3 生成响应 五、中间件5.1 什么是中间件Middleware5.2 中间件的作用及案例5.2.1 全局中间件5.2.2 局部中间件 5.3 中间件的优缺点 六、错误处理6.1 上下文存储异常信息6.2 获取异常信息 七、总结 前言 按照公司目前的任务go 学习是必经之路了虽然行业卷不过技多不压身依旧努力 说起微服务框架首当其冲的就是 JAVA 技术栈的 Spring Cloud 全家桶吃过的人都说好比较 Spring Cloud 已经可以说是完全能满足互联网后端开发需求用 Spring Cloud 来搭建一个三高高并发、高可用、高性能的后端架构并非难事。 Spring CloudZuul路由、Gateway路由、Eureka注册中心、Hystrix熔断限流、Config配置中心、Bus事件消息总线、Sleuth日志收集链路追踪、Ribbon负载均衡、OpenFeignAPI 调用 等。 Spring Cloud AlibabaNacos注册配置中心、Sentinel限流降级、Seata分布式事务、Stream分布式消息等。 那 Go 语言自然也会包容微服务的思想Gin 就是 Go 语言中的一个微服务框架是一个轻量级的、高性能的 Web 框架为专门构建快速的 Web 应用和 API 而设计。 一、Gin 简介 Gin 是一个轻量级的、高性能的 Web 框架专门为构建快速的 Web 应用和 API 而设计。它是基于 Go 语言的标准库提供了简单易用的 API 和许多有用的功能开发者可以快速地构建和部署 Web 服务。强大的路由和中间件支持Gin 提供了灵活的路由定义和中间件机制可以方便的处理各种负责的逻辑。适用于构建 RESTful APIGin 提供了 JSON 构建和解析响应功能非常适合构建 RESTful 风格 API。 当然也有不足之处 功能相对简化相比一些成熟的 Web 框架Gin 在一些方面较为简化如模板渲染等。社区相对较小虽然 Gin 在国内拥有一定的用户群体但是相对 Spring 等其他 Web 框架社区还是相对较小的。 二、Gin 框架搭建 在使用 Gin 框架之前首先需要安装 Gin 包就类似 JAVA 中如果要用到 web 模块就需要映入 starter-web 模块。 2.1 安装 Gin 通过如下命令来安装 go get github.com/gin-gonic/gin2.2 简单示例 下面是一个基于 Gin 写的一个 简单的 API 示例。 示例中首先导入 “github.com/gin-gonic/gin” 包并使用 gin.Default() 来创建一个默认的 Gin 引擎 router。然后使用 router 来定义了一个 路由使用匿名函数来处理响应返回了一个 Hello Gin 的相应字符串。最后使用 router.Run() 启动这个 HTTP 服务。 package mainimport (net/httpgithub.com/gin-gonic/gin )func main() {// 创建一个 Gin 引擎router : gin.Default()// 定义路由和处理函数这里使用匿名函数router.GET(/, func(ctx *gin.Context) {ctx.String(http.StatusOK, Hello Gin)})// 启动 HTTP 服务器router.Run(127.0.0.1:8080) }我们使用 go run hello.go 来运行浏览器访问测试 三、路由和处理函数 3.1 什么是路由 路由是指根据客户端请求的 URL 路径将请求映射到相应的处理函数上这里对比 SpringMVC 框架的 DispatcherServlet 控制中心。在 Web 应用中当用户访问不同的 URL 路径时应用程序就需要调用相对于的处理函数来处理用户的请求每个请求的处理函数都有不同的业务逻辑路由就会帮你将不同的请求分配到正确的处理函数上。 在 Gin 框架中你可以使用不同的 HTTP 方法GET, POST, PUT, DELETE等来定义不同的路由并且为每一个路由指定一个处理函数。 3.2 Gin 框架中的路由及案例 Gin 框架中采用的路由是基于 httprouter 做的。 下面来看一个小小的示例 下面示例中通过 Gin 框架定义了 /hello GET 接口和 /add POST 接口并且从请求体中获取 name 参数。 我来来看一个包中我们可以定义不同路由已完成不同的请求操作。 package mainimport (fmtnet/httpgithub.com/gin-gonic/gin )func main() {// 创建一个 Gin 引擎router : gin.Default()// 定义路由和处理函数这里使用匿名函数router.GET(/hello, func(ctx *gin.Context) {// 从请求体中查询 name 参数name : ctx.Query(name)fmt.Printf(接收到参数%s, name)ctx.String(http.StatusOK, Hello Gin! %s, name)})router.POST(/add, func(ctx *gin.Context) {var requestData struct {Name string json:name binding:required}// 使用 ShouldBindJSON 方法将请求体中的 JSON 数据绑定到结构体中if err : ctx.ShouldBindJSON(requestData); err ! nil {ctx.JSON(http.StatusBadRequest, gin.H{error:: err.Error()})return}// 从结构体中获取参数name : requestData.Nameif len(name) 0 {fmt.Println(获取name参数失败)ctx.String(http.StatusBadRequest, add fail!)} else {fmt.Printf(添加操作%v 完成\n, name)ctx.String(http.StatusOK, %s add successful!, name)}})// 启动 HTTP 服务器router.Run(127.0.0.1:8080) } 我们 Postman 来请求测试 /hello GET 接口 /add POST 请求 3.3 实际开发中的应用及优缺点 在实际开发中路由和函数处理运用非常广泛以下是一些例子 页面访问给页面提供不同的 API 接口以供页面获取数据渲染当用户访问不同的页面或资源时通过 URL 统一资源定位符 来调用不同的路由获取资源。API 路由除了前端页面其他客户端比如小程序、APP、给第三方系统提供接口等。 优点: 组织结构清晰路由可以将不同的请求和处理函数组织起来以便代码更加清晰。模块化开发可以实现模块化开发每个处理函数对应每个路由处理不同的业务请求。灵活性路由可以通过不同的 URL 路径调用处理不同的处理函数实现灵活处理请求。 缺点: 路由管理如果规模庞大路由管理可能变的复杂需要合理地组织维护。路由冲突在定义路由时如果定义了相同的路由可能会导致路由冲突。可读性如果路由过多或者命名不清晰可能会降低代码的可读性。 四、请求和响应处理 在 Gin 框架中请求和响应处理是开发 Web 应用的核心部分也是程序猿日常做的最多的事情。 每开发一个API逃不过这几步骤 4.1 接受参数 获取 Request Header 参数 token : ctx.GetHeader(token)获取 Request Path 参数 id : ctx.Param(id)获取 Request Param 参数 name : ctx.Query(name)获取 Request Body 参数 在获取 RequestBody 参数是我们需要封装结构体然后绑定请求体到结构体中。 var requestData struct {Name string json:name binding:required } // 使用 ShouldBindJSON 方法将请求体中的 JSON 数据绑定到结构体中 if err : ctx.ShouldBindJSON(requestData); err ! nil {ctx.JSON(http.StatusBadRequest, gin.H{error:: err.Error()})return } // 从结构体中获取参数 name : requestData.Name4.2 处理请求 在路由处理函数中你可以执行你想要的处理逻辑。例如你可以查询数据库、调用其他函数、处理数据等等。处理请求的逻辑在路由处理函数中实现声明处理函数或者使用匿名函数来处理。 4.3 生成响应 目前大多数的 Web 应用开发或者是系统之间相互调用、传参、接受数据等大多都是 JSON 格式数据那在 SpringMVC 框架中有做封装那在 Gin 框架中也是如此。 下面的案例中我们通过 ctx.JSON() 方法向前端以 json 格式把数据返回你可以将响应的数据封装成一个 gin.H类似 map对象然后使用 ctx.JSON 方法将其作为响应的主体返回给客户端。 注意: 这里碰到一个小坑忘记了 Go 语法中小写是没有导出权限的所以导致 postman 访问data 中总是 [] 的询问 大佬chatGPT才知道其中之奥妙需大写。 package mainimport (net/httpgithub.com/gin-gonic/gin )func main() {// 创建一个 Gin 引擎router : gin.Default()// 创建一个 Get 请求router.GET(/test/:id, func(ctx *gin.Context) {id : ctx.Param(id)name : ctx.Query(name)data : struct {// 注意这里定义字段一定要大写要不然则不能导出返回空Id interface{} json:idName string json:name}{Id: id,Name: name,}ctx.JSON(http.StatusOK, gin.H{code: 200, message: 请求成功, data: data})})// 启动服务router.Run(:8080) }在 postma 中测试 调用http://127.0.01:8080/test/10?namephen 响应 {code: 200,data: {id: 10,name: phen},message: 请求成功 }当然如果需要返回其他类型的响应比如 HTML页面、纯文本等可以使用 ctx.HTML、ctx.String等方法根据需要设置适当的状态码和响应头。 五、中间件 5.1 什么是中间件Middleware 中间件Middleware是一种常见的软件设计模式在 Web 开发中用于请求和响应之间添加自定义逻辑。中间件可以在请求到达处理函数之前或者在响应客户端之前对请求和响应做处理。在 Gin 框架中中间件是一种非常重要的概念用于处理一些通用的操作。如果知道 SpringMVC框架的话就会知道 Filter 过滤器Filter 有 Pre-proces 和 Post-process 操作Gin 框架的中间件和 Filter 差不多。 5.2 中间件的作用及案例 中间件的作用对于请求和响应的进行预处理、后处理和记录以便实现如下功能不限于 身份验证和授权中间件中进行用户身份验证和授权确保用户能够访问特定资源。日志记录可以在中间件中记录 PV、用户操作记录等便于监控和排错。请求参数验证在中间件中可以进行参数验证、XSS 攻击过滤等确保用户提交的订单数据合法。缓存和性能优化可以在中间件中进行热数据的缓存减少后端数据库的压力。防爬机制可以在中间件中对请求参数等进行校验以防别人通过接口爬数据。请求耗时统计中间件中记录请求耗时以便性能分析。 如何使用中间件呢 5.2.1 全局中间件 在上面的案例中加入了中间件的使用在下面的案例中定义了一个 Logger() 函数来记录请求日志在 Logger() 函数中首先记录请求请求进入时间调用 Next() 函数 继续处理请求 最后记录结束记录时间和耗时。 package mainimport (fmtlognet/httptimegithub.com/gin-gonic/gin )// 定义中间件处理函数用户记录日志 func Logger() gin.HandlerFunc {// 使用自定义函数来处理return func(ctx *gin.Context) {fmt.Println(Middleware Logger Handler...)start : time.Now()// 调用 Next 继续处理请求ctx.Next()end : time.Now()latency : end.Sub(start)log.Printf([%s] 请求方法%s 请求路径%s 耗时%v, end.Format(2006-01-02 15:04:05), ctx.Request.Method, ctx.Request.URL.Path, latency)} }func main() {// 创建一个 Gin 引擎router : gin.Default()// 添加自定义的 Logger 中间件router.Use(Logger())// 定义路由和处理函数这里使用匿名函数router.GET(/hello, func(ctx *gin.Context) {// 从请求体中查询 name 参数name : ctx.Query(name)fmt.Printf(请求处理...接收到参数%s \n, name)ctx.String(http.StatusOK, Hello Gin! %s, name)})router.POST(/add, func(ctx *gin.Context) {var requestData struct {Name string json:name binding:required}// 使用 ShouldBindJSON 方法将请求体中的 JSON 数据绑定到结构体中if err : ctx.ShouldBindJSON(requestData); err ! nil {ctx.JSON(http.StatusBadRequest, gin.H{error:: err.Error()})return}// 从结构体中获取参数name : requestData.Nameif len(name) 0 {fmt.Println(获取name参数失败)ctx.String(http.StatusBadRequest, add fail!)} else {fmt.Printf(添加操作%v 完成\n, name)ctx.String(http.StatusOK, %s add successful!, name)}})// 启动 HTTP 服务器router.Run(127.0.0.1:8080) } 通过 Postman 请求测试 从上面的截图中可以看处每次请求都调用到了中间件 Logger()。 5.2.2 局部中间件 上面是全局中间件所有请求都会进入中间件但是有时候并非所有请求都需要中间件处理这时候就需要某几个特殊的 API 接口实现中间件即可。 package mainimport (errorsfmtlognet/httpgithub.com/gin-gonic/gin )// 定义局部中间件函数检查用户权限 func checkAuth() gin.HandlerFunc {return func(ctx *gin.Context) {token : ctx.Query(token)if len(token) 0 {ctx.Error(errors.New(无权访问))ctx.JSON(http.StatusForbidden, gin.H{code: 403, message: 无权访问})} else {log.Printf(请求方法%s 请求路径%s 正常访问, ctx.Request.Method, ctx.Request.URL.Path)}} }func main() {// 创建一个 Gin 引擎router : gin.Default()router.GET(/list, checkAuth(), func(ctx *gin.Context) {errors : ctx.Errorsif errors ! nil {ctx.Errors nilreturn}data : struct {// 注意这里定义字段一定要大写要不然则不能导出返回空Id interface{} json:idName string json:name}{Id: 1,Name: phen,}fmt.Println(data: , data)ctx.JSON(http.StatusOK, gin.H{code: 200, message: 请求成功, data: data})})// 启动 HTTP 服务器router.Run(127.0.0.1:8080) }通过浏览器访问测试: 访问成功 无权访问 从两张截图中可以看出有 token 则访问成功没 token 则人访问失败 注意、注意、注意 这里遇到一个问题第一次测试是我的代码中没有 ctx.Errors nil 这句代码就发现如下情况 第一次访问不带 token 参数自然无权访问第二次访问带上 token, 没有无权访问但是也没有访问成功结果为啥呢chatGPT 告诉我 因为 Gin 框架上下文在一个请求中是共享的所以在同一个请求的不同处理函数中上下文中的数据和异常信息是可以共享的。 这种设计有助于在请求的不同处理阶段中传递数据和异常信息但也需要小心处理以确保不会导致意外的结果。如果你想要在每次请求中使用一个干净的上下文可以在每个请求处理函数的开头重新初始化上下文或者在处理函数之间隔离上下文。 如果你不希望在不同请求之间共享异常信息你可以在每次请求开始时将上下文清空或初始化以确保上下文不会受到之前请求的影响。 所以我加入了这句代码 ctx.Errors nil每次访问过之后清楚调异常信息则每次访问的时候带 token 则访问成功不带则无权访问这样的处理对于新手的我来说应该不是很合理后面找大佬咨询或者哪位大佬看到了评论区指导一下。 5.3 中间件的优缺点 有点 代码复用中间件可以通过将公共的代码逻辑提取出来进行封装实现代码的复用避免相似逻辑和重复代码。逻辑解耦中间件可以将请求和处理逻辑解耦是的代码更加清晰、模块化和易于维护。灵活性中间件可以在不同的路由器上使用在上面的案例中/hello GET 和 /add POST 路由都使用了 Logger() 中间件。 缺点 复杂性通过中间件处理可能会增加业务的复杂性不当使用会导致业务代码难以理解。性能影响每次请求都需要经过中间件这样中间件中逻辑如果过于复杂可能影响请求API性能。 六、错误处理 Gin 框架中提供了一种简便的方式来处理函数中发生的异常确保错误能够捕获并且正确的返回给前端。 6.1 上下文存储异常信息 在下面的案例中定义了一个 failFunc() 函数此函数的作用就是返回一个异常当在 Get() 方法中获取到的 err 时则用 ctx.Error(err) 将错误信息存储在 Gin 上下文中。这样Gin 框架会在请求处理完毕后检查是否有存储的异常信息如果有则把错误信息返回给前端。 package mainimport (errorsnet/httpgithub.com/gin-gonic/gin )func failFunc() error {return errors.New(运行异常) }func main() {// 创建一个 Gin 引擎router : gin.Default()// 创建一个 Get 请求router.GET(/test/:id, func(ctx *gin.Context) {err : failFunc()if err ! nil {// 将错误信息存储在 Gin 上下文中ctx.Error(err)ctx.JSON(http.StatusInternalServerError, gin.H{code: 500, message: 服务器异常})return}ctx.JSON(http.StatusOK, gin.H{code: 200, message: 请求成功})})// 启动服务router.Run(127.0.0.1:8080) } 通过 postman 调用测试 请求http://127.0.01:8080/test/10?namephen 响应 {code: 500,message: 服务器异常 }不过我发现如果在出现异常是也就是 err 不为空是里面的 return 不要则后面所有的 ctx.JSON、ctx.String等都会成功放回所以请求结果会如下 请求http://127.0.01:8080/test/10?namephen 响应 {code: 500,message: 服务器异常 }{code: 200,message: 请求成功 }请求结束这一点不会像 Spring框架中response 过之后如果再 response 则会报错。 总之Gin 框架通过在 Gin 上下文中存储错误信息的方式提供了方法处理错误的机制使得处理函数中的错误被捕获并且能够返回给前端。 这样有助于用户体验和调试信息。 6.2 获取异常信息 而也可以通过 ctx.Errors 获取到所有运行中的异常信息 fmt.Println(运行时的所有异常, ctx.Errors)只要在 return 前通过 Errors() 方法获取存储在 Gin 中的异常信息就可以拿到所有的运行过程中的异常以便业务逻辑的判断和处理。 七、总结 什么是微框架GinGin 框架是一个轻量级的高性能的 Web 框架专门为构架快速的 Web 应用和 API 而设计。它是基于 Go 语言的标准库开发提供简单易用的 API 和其他更多的功能开发者可以快速的构建出 Web 应用并且部署。 通过 go get github.com/gin-gonic/gin 来安装 Gin 框架到开发者环境通过 框架提供的 路由和处理函数来快速开发 API接受参数通过函数处理业务逻辑然后通过 Gin 框架提供的 JSON、String、HTML等方法返回给前端不同类型数据。 通过中间件来处理公共的业务逻辑比如认证授权、日志记录等。 也有异常处理机制Gin 通过上下文存储异常信息然后把异常信息返回给前端来实现异常的处理机制提高用户体验和调试信息。 最后Gin 框架总算是有些入门了后面继续学习框架其他内容然后博客分享。 现阶段还是对 Go 语言的学习阶段想必有一些地方考虑的不全面本文示例全部是亲自手敲代码并且执行通过。 如有问题还请指教。 评论去告诉我哦一起学习一起进步
http://www.sadfv.cn/news/38056/

相关文章:

  • 国内外免费域名解析网站牡丹江市建设工程交易中心网站
  • 可以做app的网站做电影网站用的云盘
  • 邵阳建网站多少钱东莞企业网站建立报价
  • 电商设计网站素材能赚钱的网站
  • 厦门网站搜索优化做网站后台的时候要注意什么
  • 58同城网站建设要多少钱wordpress 待审文章
  • dota2海涛做的网站科技为了上大学上交可控核聚变免费阅读
  • 网站建设方案 下载郑州房产网新房
  • 杭州网站建设怎么样软件开发文档用什么写
  • 做网站优化为什么要用国外服务器做网站
  • 北京工商局网站怎么做增资福清网站建设专家
  • 做网站挂谷歌广告赚钱吗找一个网站做搜索引擎分析
  • 实现微信绑定登录网站软文怎么优化网站
  • 网站建设可实施性报告微信营销方式
  • 二进制可以做网站是吗网站备案登录
  • asp网站如何打开网站怎么样被百度收录
  • 电脑手机网站首页员工信息查询系统
  • 格朗图手表网站怎么给网站做缓存
  • 如何管理企业网站企业网站首页图片
  • 社保网站做员工用工备案一个网站3个相似域名
  • 中国行业网站大全如何为企业网站设计完整的推广方案
  • 建站如何收费河北建设工程信息网联系电话
  • 广州企业网站建设上海公司牌照价格
  • 秀洲区住房和城乡建设局网站布吉网站建设哪家技术好
  • 沈阳建设厅网站首页创新的企业网站制作
  • 网站建设相关论文电子商务工资多少钱一个月
  • 如何查询网站点击率网站更新维护页面
  • 如何高效建设品牌网站wordpress微信机器人破解版
  • 网站别人帮做的要注意什么东西扁平网站设计
  • 怎么查看网站dns网页设计素材背景图片