中小企业公共服务平台网站建设,郑州做网站的公司有哪些,怎么 网站 wordpress,pc网站建设意见上一篇过于gin的内容
https://mp.csdn.net/mp_blog/creation/editor/131953861 CSDNhttps://mp.csdn.net/mp_blog/creation/editor/131953861 一、路由组
为了管理具有相同前缀的URL, 将拥有URL共同前缀的路由划分为一组
为了代码的阅读性#xff0c;使用{}包裹相同组的路由…上一篇过于gin的内容
https://mp.csdn.net/mp_blog/creation/editor/131953861 CSDNhttps://mp.csdn.net/mp_blog/creation/editor/131953861 一、路由组
为了管理具有相同前缀的URL, 将拥有URL共同前缀的路由划分为一组
为了代码的阅读性使用{}包裹相同组的路由不用{}包裹并不影响效果 1.1路由组 为了管理具有相同前缀的URL, 将拥有URL共同前缀的路由划分为一组
为了代码的阅读性使用{}包裹相同组的路由不用{}包裹并不影响效果 上述的两个路由都是在shop这个组下
1.2路由组嵌套 1.3所有代码
package mainimport (encoding/jsonfmtgithub.com/gin-gonic/ginnet/http
)// /user/search?usernamezhangsanaddress北京
// urlQuery 获取 url中?后面携带的参数
func urlQueryHandle(ctx *gin.Context) {// 如果指定的key 没有对应的值就使用默认值username1 : ctx.DefaultQuery(username, lisi)// 根据key 获取值username2 : ctx.Query(username)address : ctx.Query(address)// 返回JSON 字符串ctx.JSON(http.StatusOK, gin.H{message: ok,username1: username1,username2: username2,address: address,})
}// /user/search/lisi/北京。 获取请求URL路径中的参数的方式如下
// paramsPathHandle 获取url path中参数
func paramsPathHandle(ctx *gin.Context) {// 获取参数值username : ctx.Param(username)address : ctx.Param(address)// 数据返回ctx.JSON(http.StatusOK, gin.H{message: ok,username: username,address: address,})
}//// formParamsHandle 获取form表单提交数据
func formParamsHandle(ctx *gin.Context) {// 获取不到值时就是用默认值username1 : ctx.DefaultPostForm(username, lisi)username2 : ctx.PostForm(username)address : ctx.PostForm(address)// 以Json 字符串的形式返回ctx.JSON(http.StatusOK, gin.H{message: ok,username1: username1,username2: username2,address: address,})
}// json参数
// paramsJsonHandle 获取json字符串相关的参数
func paramsJsonHandle(ctx *gin.Context) {// 获取request.Body() 中的数据(这里没有进行错误处理)// 返回的是字节数组dataBytes, _ : ctx.GetRawData()// 定义一个mapvar m map[string]interface{}// 反序列化 别忘了_ json.Unmarshal(dataBytes, m)// 数据返回ctx.JSON(http.StatusOK, m)}//文件上传
/*单个文件上传文件上传接收的文件格式是: multipart/form-data
*/// singleFileUploadHandle 当文件上传
func singleFileUploadHandle(ctx *gin.Context) {// 获取文件// 根据上传时的参数名获取上传的文件内容 -- 返回对象为 *multipart.FileHeaderfileHeader, err : ctx.FormFile(file)if err ! nil {ctx.JSON(http.StatusInternalServerError, gin.H{message: err.Error(),})return}// 保存文件内容// 拼接文件名, 这里直接写死了targetFileName : fmt.Sprintf(C:/Users/黑熊精/Pictures/%s, fileHeader.Filename)//targetFileName : fmt.Sprintf(%s, fileHeader.Filename)// 将文件保存到指定的目录err ctx.SaveUploadedFile(fileHeader, targetFileName)if err ! nil {ctx.JSON(http.StatusInternalServerError, gin.H{message: err.Error(),})} else {ctx.JSON(http.StatusOK, gin.H{message: fmt.Sprintf(%s upload success!, fileHeader.Filename),})}
}//多文件上传/**多文件上传
*/// multiFileUploadHandle 多文件上传
func multiFileUploadHandle(ctx *gin.Context) {// form 是一个存储文件信息的结构体/**type Form struct {Value map[string][]stringFile map[string][]*FileHeader*/form, err : ctx.MultipartForm()if err ! nil {ctx.JSON(http.StatusInternalServerError, gin.H{message: err.Error(),})return}// 获取文件列表并保存 返回的是一个切片 []*FileHeaderfiles : form.File[file]for i, file : range files {targetFileName : fmt.Sprintf(C:/Users/黑熊精/Pictures/%d_%s, i, file.Filename)err ctx.SaveUploadedFile(file, targetFileName)if err ! nil {ctx.JSON(http.StatusInternalServerError, gin.H{message: err.Error(),})return}}ctx.JSON(http.StatusOK, gin.H{message: fmt.Sprintf(upload success!),})
}// shuldbind数据的绑定的办法
// 使用 ShouldBind() 方法, 根据请求方式自动提取 JSON, form表单 和 Query 类型的参数放入结构体中
// 用户信息信息结构体
// 加上 binding:required 标签说明该参数是必填的如果不填就会报错
type UserInfo struct {Username string json:username form:username binding:requiredAddress string json:address form:address binding:required
}// 获取query参数
func queryHandle(ctx *gin.Context) {var userInfo UserInfo// 获取数据err : ctx.ShouldBind(userInfo)if err nil {ctx.JSON(http.StatusOK, gin.H{message: ok,username: userInfo.Username,address: userInfo.Address,})} else {ctx.JSON(http.StatusBadRequest, gin.H{error: err.Error()})}
}func jsonHandle(ctx *gin.Context) {var userInfo UserInfo// 获取数据err : ctx.ShouldBind(userInfo)if err nil {ctx.JSON(http.StatusOK, gin.H{message: ok,username: userInfo.Username,address: userInfo.Address,})} else {ctx.JSON(http.StatusBadRequest, gin.H{error: err.Error()})}
}func fromHandle(ctx *gin.Context) {var userInfo UserInfo// 获取数据err : ctx.ShouldBind(userInfo)if err nil {ctx.JSON(http.StatusOK, gin.H{message: ok,username: userInfo.Username,address: userInfo.Address,})} else {ctx.JSON(http.StatusBadRequest, gin.H{error: err.Error()})}
}func main() {// 创建默认路由r : gin.Default()//两种浏览器地址获取参数的办法// 绑定路由规则 /user/search?usernamezhangsanaddress北京r.GET(/user/search, urlQueryHandle)// 2. 绑定路由规则/user/search/lisi/北京。 获取请求URL路径中的参数的方式如下r.GET(/user/search/:username/:address, paramsPathHandle)//表单提交方法// 绑定路由规则r.POST(/user/search, formParamsHandle)//json// 绑定路由规则r.POST(/user/json, paramsJsonHandle)//// 绑定路由规则--文件上传r.POST(/upload/single, singleFileUploadHandle)绑定路由规则--多文件上传r.POST(/upload/multi, multiFileUploadHandle)//使用 ShouldBind() 方法, 根据请求方式自动提取 JSON, form表单 和 Query 类型的参数放入结构体中// 绑定路由规则r.GET(/user/query, queryHandle)r.POST(/user/form, fromHandle)r.POST(/user/jsons, jsonHandle)//路由组的使用// 绑定路由规则shopGroup : r.Group(/shop){// /shop/infoshopGroup.GET(/info, func(ctx *gin.Context) {ctx.JSON(http.StatusOK, /shop/info)})// /shop/cartshopGroup.GET(/cart, func(ctx *gin.Context) {ctx.JSON(http.StatusOK, /shop/cart)})}//路由组嵌套// 绑定路由规则shopGroup1 : r.Group(/shop1){// shop/bookshopBookGroup1 : shopGroup1.Group(/book)// shop/book/infoshopBookGroup1.GET(/info, func(ctx *gin.Context) {ctx.JSON(http.StatusOK, shop/book/info)})}// 监听端口r.Run(:9000)
}二、重定向事项
Gin之重定向 1.外部重定向(redirect重定向) 2.内部重定向(redirect重定向) 3.路由重定向(forward转发)
// //go 1.重定向---www.baidu.comr.GET(/a, func(c *gin.Context) {//Redirect是*Context的方法,传入的参数是(code int, location string) ,无返回值//StatusMovedPermanently是301c.Redirect(http.StatusMovedPermanently, http://www.baidu.com/)})//内部重定向//2.内部重定向(redirect重定向)----内部重定向r.GET(/bb, func(c *gin.Context) {c.Redirect(http.StatusMovedPermanently, /b)})r.GET(/b, func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{hello: world,})})//3.路由重定向(forward转发)r.GET(/ab11, func(c *gin.Context) {/*Context结构体里有Request字段(类型是*http.Request),Request结构体里有一个URL字段(类型是*url.URL),URL结构体里面有path字段(类型是string)*///跳转到/b对应的路由处理函数c.Request.URL.Path /b11r.HandleContext(c)})r.GET(/b11, func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{hello: world,})})
1. 三、其他内容 ,所有代码
package mainimport (encoding/jsonfmtgithub.com/gin-gonic/ginnet/http
)// /user/search?usernamezhangsanaddress北京
// urlQuery 获取 url中?后面携带的参数
func urlQueryHandle(ctx *gin.Context) {// 如果指定的key 没有对应的值就使用默认值username1 : ctx.DefaultQuery(username, lisi)// 根据key 获取值username2 : ctx.Query(username)address : ctx.Query(address)// 返回JSON 字符串ctx.JSON(http.StatusOK, gin.H{message: ok,username1: username1,username2: username2,address: address,})
}// /user/search/lisi/北京。 获取请求URL路径中的参数的方式如下
// paramsPathHandle 获取url path中参数
func paramsPathHandle(ctx *gin.Context) {// 获取参数值username : ctx.Param(username)address : ctx.Param(address)// 数据返回ctx.JSON(http.StatusOK, gin.H{message: ok,username: username,address: address,})
}//// formParamsHandle 获取form表单提交数据
func formParamsHandle(ctx *gin.Context) {// 获取不到值时就是用默认值username1 : ctx.DefaultPostForm(username, lisi)username2 : ctx.PostForm(username)address : ctx.PostForm(address)// 以Json 字符串的形式返回ctx.JSON(http.StatusOK, gin.H{message: ok,username1: username1,username2: username2,address: address,})
}// json参数
// paramsJsonHandle 获取json字符串相关的参数
func paramsJsonHandle(ctx *gin.Context) {// 获取request.Body() 中的数据(这里没有进行错误处理)// 返回的是字节数组dataBytes, _ : ctx.GetRawData()// 定义一个mapvar m map[string]interface{}// 反序列化 别忘了_ json.Unmarshal(dataBytes, m)// 数据返回ctx.JSON(http.StatusOK, m)}//文件上传
/*单个文件上传文件上传接收的文件格式是: multipart/form-data
*/// singleFileUploadHandle 当文件上传
func singleFileUploadHandle(ctx *gin.Context) {// 获取文件// 根据上传时的参数名获取上传的文件内容 -- 返回对象为 *multipart.FileHeaderfileHeader, err : ctx.FormFile(file)if err ! nil {ctx.JSON(http.StatusInternalServerError, gin.H{message: err.Error(),})return}// 保存文件内容// 拼接文件名, 这里直接写死了targetFileName : fmt.Sprintf(C:/Users/黑熊精/Pictures/%s, fileHeader.Filename)//targetFileName : fmt.Sprintf(%s, fileHeader.Filename)// 将文件保存到指定的目录err ctx.SaveUploadedFile(fileHeader, targetFileName)if err ! nil {ctx.JSON(http.StatusInternalServerError, gin.H{message: err.Error(),})} else {ctx.JSON(http.StatusOK, gin.H{message: fmt.Sprintf(%s upload success!, fileHeader.Filename),})}
}//多文件上传/**多文件上传
*/// multiFileUploadHandle 多文件上传
func multiFileUploadHandle(ctx *gin.Context) {// form 是一个存储文件信息的结构体/**type Form struct {Value map[string][]stringFile map[string][]*FileHeader*/form, err : ctx.MultipartForm()if err ! nil {ctx.JSON(http.StatusInternalServerError, gin.H{message: err.Error(),})return}// 获取文件列表并保存 返回的是一个切片 []*FileHeaderfiles : form.File[file]for i, file : range files {targetFileName : fmt.Sprintf(C:/Users/黑熊精/Pictures/%d_%s, i, file.Filename)err ctx.SaveUploadedFile(file, targetFileName)if err ! nil {ctx.JSON(http.StatusInternalServerError, gin.H{message: err.Error(),})return}}ctx.JSON(http.StatusOK, gin.H{message: fmt.Sprintf(upload success!),})
}// shuldbind数据的绑定的办法
// 使用 ShouldBind() 方法, 根据请求方式自动提取 JSON, form表单 和 Query 类型的参数放入结构体中
// 用户信息信息结构体
// 加上 binding:required 标签说明该参数是必填的如果不填就会报错
type UserInfo struct {Username string json:username form:username binding:requiredAddress string json:address form:address binding:required
}// 获取query参数
func queryHandle(ctx *gin.Context) {var userInfo UserInfo// 获取数据err : ctx.ShouldBind(userInfo)if err nil {ctx.JSON(http.StatusOK, gin.H{message: ok,username: userInfo.Username,address: userInfo.Address,})} else {ctx.JSON(http.StatusBadRequest, gin.H{error: err.Error()})}
}func jsonHandle(ctx *gin.Context) {var userInfo UserInfo// 获取数据err : ctx.ShouldBind(userInfo)if err nil {ctx.JSON(http.StatusOK, gin.H{message: ok,username: userInfo.Username,address: userInfo.Address,})} else {ctx.JSON(http.StatusBadRequest, gin.H{error: err.Error()})}
}func fromHandle(ctx *gin.Context) {var userInfo UserInfo// 获取数据err : ctx.ShouldBind(userInfo)if err nil {ctx.JSON(http.StatusOK, gin.H{message: ok,username: userInfo.Username,address: userInfo.Address,})} else {ctx.JSON(http.StatusBadRequest, gin.H{error: err.Error()})}
}func main() {// 创建默认路由r : gin.Default()//两种浏览器地址获取参数的办法// 绑定路由规则 /user/search?usernamezhangsanaddress北京r.GET(/user/search, urlQueryHandle)// 2. 绑定路由规则/user/search/lisi/北京。 获取请求URL路径中的参数的方式如下r.GET(/user/search/:username/:address, paramsPathHandle)//表单提交方法// 绑定路由规则r.POST(/user/search, formParamsHandle)//json// 绑定路由规则r.POST(/user/json, paramsJsonHandle)//// 绑定路由规则--文件上传r.POST(/upload/single, singleFileUploadHandle)绑定路由规则--多文件上传r.POST(/upload/multi, multiFileUploadHandle)//使用 ShouldBind() 方法, 根据请求方式自动提取 JSON, form表单 和 Query 类型的参数放入结构体中// 绑定路由规则r.GET(/user/query, queryHandle)r.POST(/user/form, fromHandle)r.POST(/user/jsons, jsonHandle)//路由组的使用// 绑定路由规则shopGroup : r.Group(/shop){// /shop/infoshopGroup.GET(/info, func(ctx *gin.Context) {ctx.JSON(http.StatusOK, /shop/info)})// /shop/cartshopGroup.GET(/cart, func(ctx *gin.Context) {ctx.JSON(http.StatusOK, /shop/cart)})}//路由组嵌套// 绑定路由规则shopGroup1 : r.Group(/shop1){// shop/bookshopBookGroup1 : shopGroup1.Group(/book)// shop/book/infoshopBookGroup1.GET(/info, func(ctx *gin.Context) {ctx.JSON(http.StatusOK, shop/book/info)})}// //go 1.重定向---www.baidu.comr.GET(/a, func(c *gin.Context) {//Redirect是*Context的方法,传入的参数是(code int, location string) ,无返回值//StatusMovedPermanently是301c.Redirect(http.StatusMovedPermanently, http://www.baidu.com/)})//内部重定向//2.内部重定向(redirect重定向)----内部重定向r.GET(/bb, func(c *gin.Context) {c.Redirect(http.StatusMovedPermanently, /b)})r.GET(/b, func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{hello: world,})})//3.路由重定向(forward转发)r.GET(/ab11, func(c *gin.Context) {/*Context结构体里有Request字段(类型是*http.Request),Request结构体里有一个URL字段(类型是*url.URL),URL结构体里面有path字段(类型是string)*///跳转到/b对应的路由处理函数c.Request.URL.Path /b11r.HandleContext(c)})r.GET(/b11, func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{hello: world,})})// 监听端口r.Run(:9000)
}