我有一个可分辨名称格式的路径参数,它包含反斜杠字符.

CN=CS.Test Company Hello,OU=World,O=Hello,dnQualifier=m1Ws\+nFSkqy1xBrYUTbxGpzLEcg=

我在Go-chi服务器设置中有如下路径模式: router.Get("/companies/{companyId}", handlers.GetCompanyByID)

如果我使用以postman 编码的该路径值进行API调用,

GET https://localhost:8080/v1/companies/CN%3DCS.Test%20Company%20Hello%2COU%3DWorld%2CO%3DHello%2CdnQualifier%3Dm1Ws%5C%2BnFSkqy1xBrYUTbxGpzLEcg%3D

我得到404 Not Found,这意味着它没有在正确的位置查找/调用预期的处理程序.如果我在相同的路径参数(甚至不带反斜杠的相同的DN字符串)中使用UUID,则它正确地调用了处理程序.

我需要将此dn字符串值放在我的处理程序中,是否有匹配路径字符串的正则表达式模式,或者是否有其他解决方案来处理此问题?蒂娅.

推荐答案

看起来这条路由工作正常.

查看此演示:

package main

import (
    "fmt"
    "net/http"

    "github.com/go-chi/chi/v5"
    "github.com/go-chi/chi/v5/middleware"
)

func main() {
    r := chi.NewRouter()
    r.Use(middleware.Logger)
    r.Use(middleware.Recoverer)

    r.Get("/v1/companies/{companyId}", func(w http.ResponseWriter, r *http.Request) {
        companyID := chi.URLParam(r, "companyId")
        fmt.Println("companyId:", companyID)
        _, _ = w.Write([]byte(companyID))
    })

    http.ListenAndServe(":8080", r)
}

正在使用cURL发送请求:

$ curl -i 'http://localhost:8080/v1/companies/CN%3DCS.Test%20Company%20Hello%2COU%3DWorld%2CO%3DHello%2CdnQualifier%3Dm1Ws%5C%2BnFSkqy1xBrYUTbxGpzLEcg%3D' 
HTTP/1.1 200 OK
Date: Thu, 24 Aug 2023 03:44:33 GMT
Content-Length: 107
Content-Type: text/plain; charset=utf-8

CN%3DCS.Test%20Company%20Hello%2COU%3DWorld%2CO%3DHello%2CdnQualifier%3Dm1Ws%5C%2BnFSkqy1xBrYUTbxGpzLEcg%3D

顺便说一下,请注意该值在path中使用,而不是在query中使用.如果您在JavaScript中编码该值,则应该使用encodeURI而不是encodeURIComponent.下面的代码片段显示了不同之处:

console.log(encodeURI('CN=CS.Test Company Hello,OU=World,O=Hello,dnQualifier=m1Ws\\+nFSkqy1xBrYUTbxGpzLEcg='));
// CN=CS.Test%20Company%20Hello,OU=World,O=Hello,dnQualifier=m1Ws%5C+nFSkqy1xBrYUTbxGpzLEcg=

console.log(encodeURIComponent('CN=CS.Test Company Hello,OU=World,O=Hello,dnQualifier=m1Ws\\+nFSkqy1xBrYUTbxGpzLEcg='));
// CN%3DCS.Test%20Company%20Hello%2COU%3DWorld%2CO%3DHello%2CdnQualifier%3Dm1Ws%5C%2BnFSkqy1xBrYUTbx

并使用从encodeURI返回的值:

$ curl -i 'http://localhost:8080/v1/companies/CN=CS.Test%20Company%20Hello,OU=World,O=Hello,dnQualifier=m1Ws%5C+nFSkqy1xBrYUTbxGpzLEcg='
HTTP/1.1 200 OK
Date: Thu, 24 Aug 2023 03:54:59 GMT
Content-Length: 83
Content-Type: text/plain; charset=utf-8

CN=CS.Test Company Hello,OU=World,O=Hello,dnQualifier=m1Ws\+nFSkqy1xBrYUTbxGpzLEcg=

Go相关问答推荐

运行add. inf,这样我们就可以在app.conf中使用. inf参数了?

一种基于时间的Golang函数节制器

未对GoFr中的所有请求进行跟踪

如何在S汇编器中更高效地将全局数据加载到霓虹灯寄存器?

Makefilego version和read命令

Golang Gorm Fiber / argon2.Config 未定义

Go 中将 int 切片转换为自定义 int 切片指针类型的函数

AWS Lambda 中的 Websocket URL 超时达到错误

当我的 go build 成功时,如何修复我的 docker build 失败? Dockerfile 包括 go mod 下载

使用 Go Colly 抓取所有可能的标签并将它们放入一个变量中

在本地 go 应用程序上获取秘密的正确策略

也许在 golang 中包(字符串和字符串类型不匹配)

使用 Grafana alert 在几分钟内重复alert

regex.ReplaceAll 但如果替换则添加相同数量的字符

AddE 上的 Apache Tinkerpop gremlin-go 驱动程序 Next() 返回E0903:没有剩余结果

如何将 npm 安装进度条通过管道传输到终端?

在 Gorm 的 AfterFind() 钩子中获取智能 Select struct 的值

我相信我正确地在 sRGB 和线性 RGB 之间进行了转换,那么为什么深色的结果看起来更糟呢?

在 docker kill --signal=SIGX 上以这种方式关闭容器内运行的 go 应用程序是否安全?

在 Go 中将十六进制转换为带符号的 Int