add 路由配置
This commit is contained in:
@@ -255,3 +255,9 @@ const (
|
||||
```
|
||||
|
||||
引入 config 包,直接 `config.xx` 即可。
|
||||
|
||||
## 源码
|
||||
|
||||
**下载源码后,请先执行 `dep ensure` 下载依赖包!**
|
||||
|
||||
[查看源码](https://github.com/xinliangnote/Go/blob/master/01-Gin框架/codes/02-路由配置)
|
||||
|
||||
128
01-Gin框架/codes/02-路由配置/ginDemo/Gopkg.lock
generated
Normal file
128
01-Gin框架/codes/02-路由配置/ginDemo/Gopkg.lock
generated
Normal file
@@ -0,0 +1,128 @@
|
||||
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
|
||||
|
||||
|
||||
[[projects]]
|
||||
digest = "1:3ee1d175a75b911a659fbd860060874c4f503e793c5870d13e5a0ede529a63cf"
|
||||
name = "github.com/gin-contrib/sse"
|
||||
packages = ["."]
|
||||
pruneopts = "UT"
|
||||
revision = "54d8467d122d380a14768b6b4e5cd7ca4755938f"
|
||||
version = "v0.1.0"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:d8bd2a337f6ff2188e08f72c614f2f3f0fd48e6a7b37a071b197e427d77d3a47"
|
||||
name = "github.com/gin-gonic/gin"
|
||||
packages = [
|
||||
".",
|
||||
"binding",
|
||||
"internal/json",
|
||||
"render",
|
||||
]
|
||||
pruneopts = "UT"
|
||||
revision = "b75d67cd51eb53c3c3a2fc406524c940021ffbda"
|
||||
version = "v1.4.0"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:573ca21d3669500ff845bdebee890eb7fc7f0f50c59f2132f2a0c6b03d85086a"
|
||||
name = "github.com/golang/protobuf"
|
||||
packages = ["proto"]
|
||||
pruneopts = "UT"
|
||||
revision = "6c65a5562fc06764971b7c5d05c76c75e84bdbf7"
|
||||
version = "v1.3.2"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:f5a2051c55d05548d2d4fd23d244027b59fbd943217df8aa3b5e170ac2fd6e1b"
|
||||
name = "github.com/json-iterator/go"
|
||||
packages = ["."]
|
||||
pruneopts = "UT"
|
||||
revision = "0ff49de124c6f76f8494e194af75bde0f1a49a29"
|
||||
version = "v1.1.6"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:31e761d97c76151dde79e9d28964a812c46efc5baee4085b86f68f0c654450de"
|
||||
name = "github.com/konsorten/go-windows-terminal-sequences"
|
||||
packages = ["."]
|
||||
pruneopts = "UT"
|
||||
revision = "f55edac94c9bbba5d6182a4be46d86a2c9b5b50e"
|
||||
version = "v1.0.2"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:8654122ef85f2bc03859b0a7ea2d36c9965888689cdac7640cceaa6edb11cff6"
|
||||
name = "github.com/lestrrat-go/strftime"
|
||||
packages = ["."]
|
||||
pruneopts = "UT"
|
||||
revision = "8b31f9c59b0feb56c456ce49a7b3d2b2e93a6f18"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:9b90c7639a41697f3d4ad12d7d67dfacc9a7a4a6e0bbfae4fc72d0da57c28871"
|
||||
name = "github.com/mattn/go-isatty"
|
||||
packages = ["."]
|
||||
pruneopts = "UT"
|
||||
revision = "1311e847b0cb909da63b5fecfb5370aa66236465"
|
||||
version = "v0.0.8"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:33422d238f147d247752996a26574ac48dcf472976eda7f5134015f06bf16563"
|
||||
name = "github.com/modern-go/concurrent"
|
||||
packages = ["."]
|
||||
pruneopts = "UT"
|
||||
revision = "bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94"
|
||||
version = "1.0.3"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:e32bdbdb7c377a07a9a46378290059822efdce5c8d96fe71940d87cb4f918855"
|
||||
name = "github.com/modern-go/reflect2"
|
||||
packages = ["."]
|
||||
pruneopts = "UT"
|
||||
revision = "4b7aa43c6742a2c18fdef89dd197aaae7dac7ccd"
|
||||
version = "1.0.1"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:cf31692c14422fa27c83a05292eb5cbe0fb2775972e8f1f8446a71549bd8980b"
|
||||
name = "github.com/pkg/errors"
|
||||
packages = ["."]
|
||||
pruneopts = "UT"
|
||||
revision = "ba968bfe8b2f7e042a574c888954fccecfa385b4"
|
||||
version = "v0.8.1"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:5a1cf4e370bc86137b58da2ae065e76526d32b11f62a7665f36dbd5f41fa95ff"
|
||||
name = "github.com/ugorji/go"
|
||||
packages = ["codec"]
|
||||
pruneopts = "UT"
|
||||
revision = "23ab95ef5dc3b70286760af84ce2327a2b64ed62"
|
||||
version = "v1.1.7"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:5b3f90037a9027c43bdcae488c39d41aadecb9d85e645bb62b773a0a6f6e86b8"
|
||||
name = "golang.org/x/sys"
|
||||
packages = ["unix"]
|
||||
pruneopts = "UT"
|
||||
revision = "6ec70d6a5542cba804c6d16ebe8392601a0b7b60"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:cbc72c4c4886a918d6ab4b95e347ffe259846260f99ebdd8a198c2331cf2b2e9"
|
||||
name = "gopkg.in/go-playground/validator.v8"
|
||||
packages = ["."]
|
||||
pruneopts = "UT"
|
||||
revision = "5f1438d3fca68893a817e4a66806cea46a9e4ebf"
|
||||
version = "v8.18.2"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:4d2e5a73dc1500038e504a8d78b986630e3626dc027bc030ba5c75da257cdb96"
|
||||
name = "gopkg.in/yaml.v2"
|
||||
packages = ["."]
|
||||
pruneopts = "UT"
|
||||
revision = "51d6538a90f86fe93ac480b35f37b2be17fef232"
|
||||
version = "v2.2.2"
|
||||
|
||||
[solve-meta]
|
||||
analyzer-name = "dep"
|
||||
analyzer-version = 1
|
||||
input-imports = [
|
||||
"github.com/gin-gonic/gin",
|
||||
]
|
||||
solver-name = "gps-cdcl"
|
||||
solver-version = 1
|
||||
33
01-Gin框架/codes/02-路由配置/ginDemo/Gopkg.toml
Normal file
33
01-Gin框架/codes/02-路由配置/ginDemo/Gopkg.toml
Normal file
@@ -0,0 +1,33 @@
|
||||
# Gopkg.toml example
|
||||
#
|
||||
# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html
|
||||
# for detailed Gopkg.toml documentation.
|
||||
#
|
||||
# required = ["github.com/user/thing/cmd/thing"]
|
||||
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
|
||||
#
|
||||
# [[constraint]]
|
||||
# name = "github.com/user/project"
|
||||
# version = "1.0.0"
|
||||
#
|
||||
# [[constraint]]
|
||||
# name = "github.com/user/project2"
|
||||
# branch = "dev"
|
||||
# source = "github.com/myfork/project2"
|
||||
#
|
||||
# [[override]]
|
||||
# name = "github.com/x/y"
|
||||
# version = "2.4.0"
|
||||
#
|
||||
# [prune]
|
||||
# non-go = false
|
||||
# go-tests = true
|
||||
# unused-packages = true
|
||||
|
||||
[[constraint]]
|
||||
name = "github.com/gin-gonic/gin"
|
||||
version = "1.4.0"
|
||||
|
||||
[prune]
|
||||
go-tests = true
|
||||
unused-packages = true
|
||||
101
01-Gin框架/codes/02-路由配置/ginDemo/common/common.go
Normal file
101
01-Gin框架/codes/02-路由配置/ginDemo/common/common.go
Normal file
@@ -0,0 +1,101 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"crypto/md5"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"ginDemo/config"
|
||||
"github.com/gin-gonic/gin"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"sort"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
// 打印
|
||||
func Print(i interface{}) {
|
||||
fmt.Println("---")
|
||||
fmt.Println(i)
|
||||
fmt.Println("---")
|
||||
}
|
||||
|
||||
// 返回JSON
|
||||
func RetJson(code, msg string, data interface{}, c *gin.Context) {
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"code" : code,
|
||||
"msg" : msg,
|
||||
"data" : data,
|
||||
})
|
||||
c.Abort()
|
||||
}
|
||||
|
||||
// 获取当前时间戳
|
||||
func GetTimeUnix() int64 {
|
||||
return time.Now().Unix()
|
||||
}
|
||||
|
||||
// MD5 方法
|
||||
func MD5(str string) string {
|
||||
s := md5.New()
|
||||
s.Write([]byte(str))
|
||||
return hex.EncodeToString(s.Sum(nil))
|
||||
}
|
||||
|
||||
// 生成签名
|
||||
func CreateSign(params url.Values) string {
|
||||
var key []string
|
||||
var str = ""
|
||||
for k := range params {
|
||||
if k != "sn" {
|
||||
key = append(key, k)
|
||||
}
|
||||
}
|
||||
sort.Strings(key)
|
||||
for i := 0; i < len(key); i++ {
|
||||
if i == 0 {
|
||||
str = fmt.Sprintf("%v=%v", key[i], params.Get(key[i]))
|
||||
} else {
|
||||
str = str + fmt.Sprintf("&%v=%v", key[i], params.Get(key[i]))
|
||||
}
|
||||
}
|
||||
// 自定义签名算法
|
||||
sign := MD5(MD5(str) + MD5(config.APP_NAME + config.APP_SECRET))
|
||||
return sign
|
||||
}
|
||||
|
||||
// 验证签名
|
||||
func VerifySign(c *gin.Context) {
|
||||
var method = c.Request.Method
|
||||
var ts int64
|
||||
var sn string
|
||||
var req url.Values
|
||||
|
||||
if method == "GET" {
|
||||
req = c.Request.URL.Query()
|
||||
sn = c.Query("sn")
|
||||
ts, _ = strconv.ParseInt(c.Query("ts"), 10, 64)
|
||||
|
||||
} else if method == "POST" {
|
||||
req = c.Request.PostForm
|
||||
sn = c.PostForm("sn")
|
||||
ts, _ = strconv.ParseInt(c.PostForm("ts"), 10, 64)
|
||||
} else {
|
||||
RetJson("500", "Illegal requests", "", c)
|
||||
return
|
||||
}
|
||||
|
||||
exp, _ := strconv.ParseInt(config.API_EXPIRY, 10, 64)
|
||||
|
||||
// 验证过期时间
|
||||
if ts > GetTimeUnix() || GetTimeUnix() - ts >= exp {
|
||||
RetJson("500", "Ts Error", "", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 验证签名
|
||||
if sn == "" || sn != CreateSign(req) {
|
||||
RetJson("500", "Sn Error", "", c)
|
||||
return
|
||||
}
|
||||
}
|
||||
9
01-Gin框架/codes/02-路由配置/ginDemo/config/config.go
Normal file
9
01-Gin框架/codes/02-路由配置/ginDemo/config/config.go
Normal file
@@ -0,0 +1,9 @@
|
||||
package config
|
||||
|
||||
const (
|
||||
PORT = ":8080"
|
||||
APP_NAME = "ginDemo"
|
||||
APP_SECRET = "6YJSuc50uJ18zj45"
|
||||
API_EXPIRY = "120"
|
||||
|
||||
)
|
||||
15
01-Gin框架/codes/02-路由配置/ginDemo/controller/v1/member.go
Normal file
15
01-Gin框架/codes/02-路由配置/ginDemo/controller/v1/member.go
Normal file
@@ -0,0 +1,15 @@
|
||||
package v1
|
||||
|
||||
import "github.com/gin-gonic/gin"
|
||||
|
||||
func AddMember(c *gin.Context) {
|
||||
// 获取 Get 参数
|
||||
name := c.Query("name")
|
||||
price := c.DefaultQuery("price", "100")
|
||||
|
||||
c.JSON(200, gin.H{
|
||||
"v1" : "AddMember",
|
||||
"name" : name,
|
||||
"price" : price,
|
||||
})
|
||||
}
|
||||
15
01-Gin框架/codes/02-路由配置/ginDemo/controller/v1/product.go
Normal file
15
01-Gin框架/codes/02-路由配置/ginDemo/controller/v1/product.go
Normal file
@@ -0,0 +1,15 @@
|
||||
package v1
|
||||
|
||||
import "github.com/gin-gonic/gin"
|
||||
|
||||
func AddProduct(c *gin.Context) {
|
||||
// 获取 Get 参数
|
||||
name := c.Query("name")
|
||||
price := c.DefaultQuery("price", "100")
|
||||
|
||||
c.JSON(200, gin.H{
|
||||
"v1" : "AddProduct",
|
||||
"name" : name,
|
||||
"price" : price,
|
||||
})
|
||||
}
|
||||
9
01-Gin框架/codes/02-路由配置/ginDemo/controller/v2/member.go
Normal file
9
01-Gin框架/codes/02-路由配置/ginDemo/controller/v2/member.go
Normal file
@@ -0,0 +1,9 @@
|
||||
package v2
|
||||
|
||||
import "github.com/gin-gonic/gin"
|
||||
|
||||
func AddMember(c *gin.Context) {
|
||||
c.JSON(200, gin.H{
|
||||
"v2" : "AddMember",
|
||||
})
|
||||
}
|
||||
17
01-Gin框架/codes/02-路由配置/ginDemo/controller/v2/product.go
Normal file
17
01-Gin框架/codes/02-路由配置/ginDemo/controller/v2/product.go
Normal file
@@ -0,0 +1,17 @@
|
||||
package v2
|
||||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func AddProduct(c *gin.Context) {
|
||||
// 获取 Get 参数
|
||||
name := c.Query("name")
|
||||
price := c.DefaultQuery("price", "100")
|
||||
|
||||
c.JSON(200, gin.H{
|
||||
"v2" : "AddProduct",
|
||||
"name" : name,
|
||||
"price" : price,
|
||||
})
|
||||
}
|
||||
14
01-Gin框架/codes/02-路由配置/ginDemo/main.go
Normal file
14
01-Gin框架/codes/02-路由配置/ginDemo/main.go
Normal file
@@ -0,0 +1,14 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"ginDemo/config"
|
||||
"ginDemo/router"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func main() {
|
||||
gin.SetMode(gin.ReleaseMode) // 默认为 debug 模式,设置为发布模式
|
||||
engine := gin.Default()
|
||||
router.InitRouter(engine) // 设置路由
|
||||
engine.Run(config.PORT)
|
||||
}
|
||||
42
01-Gin框架/codes/02-路由配置/ginDemo/router/router.go
Normal file
42
01-Gin框架/codes/02-路由配置/ginDemo/router/router.go
Normal file
@@ -0,0 +1,42 @@
|
||||
package router
|
||||
|
||||
import (
|
||||
"ginDemo/common"
|
||||
"ginDemo/controller/v1"
|
||||
"ginDemo/controller/v2"
|
||||
"github.com/gin-gonic/gin"
|
||||
"net/url"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
func InitRouter(r *gin.Engine) {
|
||||
|
||||
r.GET("/sn", SignDemo)
|
||||
|
||||
// v1 版本
|
||||
GroupV1 := r.Group("/v1")
|
||||
{
|
||||
GroupV1.Any("/product/add", v1.AddProduct)
|
||||
GroupV1.Any("/member/add", v1.AddMember)
|
||||
}
|
||||
|
||||
// v2 版本
|
||||
GroupV2 := r.Group("/v2", common.VerifySign)
|
||||
{
|
||||
GroupV2.Any("/product/add", v2.AddProduct)
|
||||
GroupV2.Any("/member/add", v2.AddMember)
|
||||
}
|
||||
}
|
||||
|
||||
func SignDemo(c *gin.Context) {
|
||||
ts := strconv.FormatInt(common.GetTimeUnix(), 10)
|
||||
res := map[string]interface{}{}
|
||||
params := url.Values{
|
||||
"name" : []string{"a"},
|
||||
"price" : []string{"10"},
|
||||
"ts" : []string{ts},
|
||||
}
|
||||
res["sn"] = common.CreateSign(params)
|
||||
res["ts"] = ts
|
||||
common.RetJson("200", "", res, c)
|
||||
}
|
||||
Reference in New Issue
Block a user