golang的urlrouter

起因

做权限管理,需要匹配路由,这个需要路由查找算法,一般采用tried 树,然而之前没研究过,一时半会也写不出来。在GitHub上找了一些router,然而都和http请求结合的很紧密,剥离一个纯粹的url匹配很困难。
后来发现了naoina/denco,作者就是采用分开设计的方式,于是直接拿来用了。

问题

经过测试却发现,denco对restful形式的路由支持很好,然而传统的问号后面接请求参数形式不支持,于是修改了一下router.go里的makeRecords函数,添加了如下代码:

//添加了?
if strings.Contains(r.Key,string(QueryCharacter)) {
        oldKey := r.Key
        r.Key += string(WildcardCharacter) + termChar
        params = append(params, &record{Record: r})

        r.Key = strings.Replace(oldKey,string(QueryCharacter),"",1)
        statics = append(statics, &record{Record: r})
        continue
}

当有规则里有问号匹配有问号和无问号的,当没有问号时完全匹配

测试代码

package main

import (

    "fmt"
    "github.com/dwdcth/urlrouter"
)
type route struct {
    name string
}

func main() {
    router := urlrouter.New()
    router.Build([]urlrouter.Record{
        {"/", &route{"root"}},
        {"/user/:id", &route{"user"}},
        {"/user/:name/:id", &route{"username"}},
        {"/static/*filepath", &route{"static"}},
        {"/test?", &route{"test"}},
    })

    data, params, found := router.Lookup("/")
    // print `&main.route{name:"root"}, denco.Params(nil), true`.
    fmt.Printf("%#v, %#v, %#v\n", data, params, found)

    data, params, found = router.Lookup("/user/hoge")
    // print `&main.route{name:"user"}, denco.Params{denco.Param{Name:"id", Value:"hoge"}}, true`.
    fmt.Printf("%#v, %#v, %#v\n", data, params, found)

    data, params, found = router.Lookup("/user/hoge/7")
    // print `&main.route{name:"username"}, denco.Params{denco.Param{Name:"name", Value:"hoge"}, denco.Param{Name:"id", Value:"7"}}, true`.
    fmt.Printf("%#v, %#v, %#v\n", data, params, found)

    data, params, found = router.Lookup("/static/path/to/file")
    // print `&main.route{name:"static"}, denco.Params{denco.Param{Name:"filepath", Value:"path/to/file"}}, true`.
    fmt.Printf("%#v, %#v, %#v\n", data, params, found)

    // both /test and /test?params can found
    data, params, found = router.Lookup("/test")
    // print `&main.route{name:"test"}, urlrouter.Params(nil), true`.
    fmt.Printf("%#v, %#v, %#v\n", data, params, found)

    data, params, found = router.Lookup("/test?hello=world&name=tom")
    // print `&main.route{name:"test"}, urlrouter.Params{urlrouter.Param{Name:"", Value:"hello=world&name=tom"}}, true`.
    fmt.Printf("%#v, %#v, %#v\n", data, params, found)

}

修改后的代码在此

转载于:https://www.cnblogs.com/xdao/p/golang_urlrouter.html

Golang 中使用 Gin 框架处理 HTTP 请求时,可以使用 `PUT` 方法来处理客户端发送的 HTTP PUT 请求。Gin 框架提供了一种方便的方式来定义路由和处理不同类型的 HTTP 请求。 下面是一个简单的示例,展示如何使用 Gin 处理 HTTP PUT 请求: ```go package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { // 创建 Gin 的默认引擎 router := gin.Default() // 定义 PUT 请求的路由和处理函数 router.PUT("/users/:id", updateUser) // 启动 HTTP 服务器 router.Run(":8080") } func updateUser(c *gin.Context) { // 获取 URL 参数 id := c.Param("id") // 从请求中获取 JSON 数据 var user User if err := c.ShouldBindJSON(&user); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // 在这里执行更新用户的逻辑 c.JSON(http.StatusOK, gin.H{"message": "User updated", "id": id}) } type User struct { Name string `json:"name"` Email string `json:"email"` } ``` 在上述示例中,我们首先创建了一个默认的 Gin 引擎。然后,使用 `router.PUT` 方法定义了一个路由,该路由匹配 `/users/:id` 的 PUT 请求。当客户端发送 PUT 请求到该路由时,Gin 将调用 `updateUser` 函数来处理请求。 在 `updateUser` 函数中,我们首先通过 `c.Param` 方法获取 URL 参数 `id`。然后,使用 `c.ShouldBindJSON` 方法从请求中获取 JSON 数据,并将其绑定到 `user` 结构体中。如果绑定过程出错,我们将返回一个带有错误信息的 JSON 响应。 最后,我们可以在 `updateUser` 函数中执行更新用户的逻辑,并返回一个成功的 JSON 响应。 这只是一个简单的示例,你可以根据自己的需求来定义更复杂的路由和处理函数。 希望这能帮助到你!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值