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

黄山网站建设布吉商城网站建设

黄山网站建设,布吉商城网站建设,如何在网站后台做网页,济南网站建设手机文章目录 模版使用流程参数传递路由分组数据解析和绑定gin中间件 模版使用流程 package mainimport (net/httpgithub.com/gin-gonic/gin )func main() {// 1.创建路由r : gin.Default()// 2.绑定路由规则#xff0c;执行的函数// gin.Context#x… 文章目录 模版使用流程参数传递路由分组数据解析和绑定gin中间件 模版使用流程 package mainimport (net/httpgithub.com/gin-gonic/gin )func main() {// 1.创建路由r : gin.Default()// 2.绑定路由规则执行的函数// gin.Context封装了request和responser.GET(/, func(c *gin.Context) {c.String(http.StatusOK, hello World!)})// 3.监听端口默认在8080// Run(里面不指定端口号默认为8080) r.Run(:8000) }运行访问http://localhost:8000/ 后面为了减少累赘代码只展示路由规则部分代码编写创建路由以及端口监听部分代码保存相同。 参数传递 API传参可以通过Context的Param方法来获取API参数。 r.GET(/user/:name, func(c *gin.Context) {name : c.Param(name)c.String(http.StatusOK, Hello name!)})r.GET(/user/:name/*action, func(c *gin.Context) {name : c.Param(name)action : c.Param(action)c.String(http.StatusOK, Hello name!Action action)})*action 表示一个通配路径参数可以匹配 URL 剩余部分的路径并且会包含匹配部分的斜杠 /。 URL传参URL参数可以通过DefaultQuery()或Query()方法获取DefaultQuery()若参数不存在返回默认值Query()若不存在返回空串。 DefaultQuery默认值只支持string类型 func (c *Context) DefaultQuery(key, defaultValue string) string {if value, ok : c.GetQuery(key); ok {return value}return defaultValue }r.GET(/user, func(c *gin.Context) {name : c.DefaultQuery(name, Test)ageStr : c.DefaultQuery(age, 18)age, err : strconv.Atoi(ageStr)if err ! nil {c.String(http.StatusBadRequest, Invalid age)return}c.String(http.StatusOK, fmt.Sprintf(%s is %d years old, name, age))})表单传值 form actionhttp://localhost:8000/form methodpost actionapplication/x-www-form-urlencoded用户名input typetext nameusername placeholder请输入你的用户名 br密nbsp;nbsp;nbsp;码input typepassword nameuserpassword placeholder请输入你的密码 brinput typesubmit value提交/formr.POST(/form, func(c *gin.Context) {types : c.DefaultPostForm(type, post)username : c.PostForm(username)password : c.PostForm(userpassword)c.String(http.StatusOK, fmt.Sprintf(username:%s,password:%s,type:%s, username, password, types))})文件上传 单个文件 form actionhttp://localhost:8000/upload methodpost enctypemultipart/form-data上传文件:input typefile namefile input typesubmit value提交/form// 限制上传文件大小 (10 MiB)r.MaxMultipartMemory 10 20 // 10 MiB// 文件上传路由r.POST(/upload, func(c *gin.Context) {// 获取文件file, err : c.FormFile(file)if err ! nil {c.String(http.StatusBadRequest, File upload error: %s, err.Error())return}// 检查文件类型 (仅允许 image/png)mimeType : file.Header.Get(Content-Type)if mimeType ! image/png {c.String(http.StatusBadRequest, Invalid file type: %s. Only PNG images are allowed., mimeType)return}// 保存文件到目标路径dst : filepath.Join(./uploads, file.Filename)if err : c.SaveUploadedFile(file, dst); err ! nil {c.String(http.StatusInternalServerError, Could not save file: %s, err.Error())return}c.String(http.StatusOK, File uploaded successfully: %s, file.Filename)})多个文件 // 限制上传文件大小 (10 MiB)r.MaxMultipartMemory 10 20 // 10 MiB// 多文件上传路由r.POST(/upload/multiple, func(c *gin.Context) {// 获取表单文件 (key 为 files)form, err : c.MultipartForm()if err ! nil {c.String(http.StatusBadRequest, Form error: %s, err.Error())return}files : form.File[files] // 获取多个文件for _, file : range files {// 检查文件类型 (仅允许 image/png)mimeType : file.Header.Get(Content-Type)if mimeType ! image/png {c.String(http.StatusBadRequest, Invalid file type: %s for file: %s. Only PNG images are allowed., mimeType, file.Filename)return}// 保存文件到目标路径dst : filepath.Join(./uploads, file.Filename)if err : c.SaveUploadedFile(file, dst); err ! nil {c.String(http.StatusInternalServerError, Could not save file: %s. Error: %s, file.Filename, err.Error())return}fmt.Printf(Uploaded file: %s\n, file.Filename)}c.String(http.StatusOK, All files uploaded successfully)}) 路由分组 在 Gin 框架中路由分组Route Group是用于组织和管理路由的功能。通过路由分组可以为一组路由添加公共的前缀、中间件或配置从而提高代码的可读性和可维护性。 package mainimport (github.com/gin-gonic/ginnet/http )func main() {// 1.创建路由r : gin.Default()// 2.绑定路由规则执行的函数// gin.Context封装了request和response// 用户路由组userGroup : r.Group(/user){userGroup.GET(/login, login)userGroup.GET(/settings, func(c *gin.Context) {c.JSON(200, gin.H{message: User Settings})})}// 管理员路由组adminGroup : r.Group(/admin){adminGroup.GET(/dashboard, func(c *gin.Context) {c.JSON(200, gin.H{message: Admin Dashboard})})adminGroup.GET(/reports, func(c *gin.Context) {c.JSON(200, gin.H{message: Admin Reports})})}// 404r.NoRoute(func(c *gin.Context) {c.String(http.StatusNotFound, 404 not found )})// 3.监听端口默认在8080// Run(里面不指定端口号默认为8080)r.Run(:8000) }func login(c *gin.Context) {name : c.DefaultQuery(name, jack)c.JSON(200, gin.H{name: name}) } 数据解析和绑定 JSON数据解析和绑定的基本步骤 (1) 定义结构体 定义一个与 JSON 数据格式匹配的 Go 结构体。 (2) 使用 c.BindJSON 或 c.ShouldBindJSON c.BindJSON 会在绑定失败时返回错误并终止请求。c.ShouldBindJSON 返回错误但不会中断后续处理适合灵活的错误处理场景。 (3) 使用结构体处理数据 通过绑定的结构体直接访问解析后的字段。 package mainimport (net/httpgithub.com/gin-gonic/gin )type User struct {Name string json:name binding:required // 必填字段Age int json:age binding:required // 必填字段Email string json:email // 可选字段 }func main() {r : gin.Default()r.POST(/user, func(c *gin.Context) {var user Userif err : c.ShouldBindJSON(user); err ! nil {c.JSON(http.StatusBadRequest, gin.H{error: err.Error()})return}c.JSON(http.StatusOK, gin.H{message: User data received,user: user,})})r.Run(:8080) } Gin 提供了 binding 标签用于对字段进行验证。支持多种验证规则。 type User struct {Name string json:name binding:required,min3 // 必填最小长度 3Age int json:age binding:required,gte1 // 必填必须大于等于 1Email string json:email binding:required,email // 必填必须是合法邮箱 } 验证规则含义required必须提供该字段min字符串或切片的最小长度max字符串或切片的最大长度gte数字或时间的值必须大于等于指定值lte数字或时间的值必须小于等于指定值email必须是有效的邮箱地址 表单数据 为字段添加多种绑定方式的标签例如 json 和 form 标签。 Gin 会根据 Content-Type 自动选择适合的绑定方式 如果是 application/json则绑定 JSON 数据。如果是 application/x-www-form-urlencoded 或 multipart/form-data则绑定表单数据。 type User struct {Name string json:name form:name binding:required // 必填字段Age int json:age form:age binding:required,gte0Email string json:email form:email } URI数据 通过 c.Param 获取路径参数的值 package mainimport (net/httpgithub.com/gin-gonic/gin )func main() {r : gin.Default()r.GET(/user/:id, func(c *gin.Context) {id : c.Param(id) // 提取路径参数c.JSON(http.StatusOK, gin.H{user_id: id,})})r.Run(:8080) } Gin 提供了 ShouldBindUri 方法可以将路径参数直接绑定到结构体中方便处理和验证。 package mainimport (net/httpgithub.com/gin-gonic/gin )type UserRequest struct {ID string uri:id binding:required // 使用 uri 标签定义路径参数 }func main() {r : gin.Default()r.GET(/user/:id, func(c *gin.Context) {var req UserRequest// 将路径参数绑定到结构体if err : c.ShouldBindUri(req); err ! nil {c.JSON(http.StatusBadRequest, gin.H{error: err.Error()})return}c.JSON(http.StatusOK, gin.H{user_id: req.ID,})})r.Run(:8080) } 路径参数可以和查询参数或表单参数结合使用。Gin 支持同时解析这些参数。 package mainimport (net/httpgithub.com/gin-gonic/gin )type UserRequest struct {ID string uri:id binding:required // 路径参数Name string form:name // 查询参数或表单参数 }func main() {r : gin.Default()r.GET(/user/:id, func(c *gin.Context) {var req UserRequest// 绑定路径参数if err : c.ShouldBindUri(req); err ! nil {c.JSON(http.StatusBadRequest, gin.H{error: err.Error()})return}// 绑定查询参数if err : c.ShouldBindQuery(req); err ! nil {c.JSON(http.StatusBadRequest, gin.H{error: err.Error()})return}c.JSON(http.StatusOK, gin.H{user_id: req.ID,name: req.Name,})})r.Run(:8080) } GET /user/123?nameAlicegin中间件 在 Gin 中中间件是一个可以插入到请求处理流程中的函数用于实现请求前后的通用逻辑。例如认证、日志记录、跨域处理等都可以通过中间件实现。 中间件定义 func(c *gin.Context) {// 执行逻辑c.Next() // 调用后续处理函数// 执行逻辑 } c.Next()调用下一个中间件或处理程序。 c.Abort()停止执行后续的中间件和处理程序。 全局中间件 全局中间件会应用到所有路由使用 r.Use() 注册。 package mainimport (fmtgithub.com/gin-gonic/gin )func Logger() gin.HandlerFunc {return func(c *gin.Context) {// 请求前逻辑fmt.Println(Request URL:, c.Request.URL.Path)c.Next() // 执行后续处理// 请求后逻辑fmt.Println(Response Status:, c.Writer.Status())} }func main() {r : gin.Default()// 注册全局中间件r.Use(Logger())r.GET(/ping, func(c *gin.Context) {fmt.Println(11111111)c.String(200, pong)})r.Run(:8080) } 控制台输出 Request URL: /ping 11111111 Response Status: 200流程中间件逻辑》遇到next方法后执行路由func》中间件后面的逻辑。 局部中间件 局部中间件只应用于特定路由或路由组。 package mainimport (github.com/gin-gonic/gin )func AuthRequired() gin.HandlerFunc {return func(c *gin.Context) {token : c.GetHeader(Authorization)if token ! valid-token {c.AbortWithStatusJSON(401, gin.H{error: unauthorized})return}c.Next()} }func main() {r : gin.Default()// 局部中间件r.GET(/secure, AuthRequired(), func(c *gin.Context) {c.JSON(200, gin.H{message: Authorized})})r.Run(:8080) }
http://www.w-s-a.com/news/661280/

相关文章:

  • 怎么做可以访问网站ui设计自学学的出来吗
  • 网站如何接入支付宝软件开发工作内容描述
  • 廊坊网站建设搭建整合营销传播的效果表现为
  • 网站服务器在本地是指园林绿化
  • 公司网站建设需要什么科目网站代运营价格
  • 网站建设前的ER图ppt模板图片 背景
  • 做一个网站花多少钱网站导航营销步骤
  • 仙桃网站定制做房产网站能赚钱吗
  • 西安网站制作模板最新源码
  • 南京江宁网站建设大学高校网站建设栏目
  • 模板网站建设明细报价表做网站第一
  • 公司网站建设系统软件开发 上海
  • 怎么让公司建设网站固安县建设局网站
  • 360免费建站官网入口手机网站建设设计
  • 商城网站建站系统dw如何做网页
  • 网站建设的公司收费我有网站 怎么做淘宝推广的
  • 网站建设策划书事物选题手机兼职app
  • html5 微网站模版wordpress博客速度很慢
  • 怎么做五个页面网站网络推广如何收费
  • 上虞宇普电器网站建设江西建筑人才网
  • 在吗做网站商城一个网站需要服务器吗
  • 先做网站再备案吗中山微网站建设报价
  • 树莓派可以做网站的服务器吗网站建设与设计ppt
  • 网站访问速度分析网站怎么做让PC和手机自动识别
  • 网站建设要考西宁网站建设多少钱
  • 网站开发公司东莞网站推广计划书具体包含哪些基本内容?
  • 素材天下网站惠州网站建设行业
  • 网站做a视频在线观看网站天津建站
  • 自己做的网站怎么链接火车头采集一个网站可以做几级链接
  • 济南网站制作哪家专业做网站怎样投放广告