我使用gin@v1.9.0

正在try 从请求获取Cookie

Cookie示例:

key={"ckey": "cvalue"}

代码:

token, err := c.Request.Cookie("key")

返回错误

http: named cookie not present

但没有花括号,工作起来很好

Cookie示例:

key=cvalue

接收 token = "key=cvalue"

推荐答案

发生此问题是因为Cookie值格式.

让我们来看看net/http个代码中的以下代码

 // Strip the quotes, if present.
if allowDoubleQuote && len(raw) > 1 && raw[0] == '"' && raw[len(raw)-1] == '"' {
    raw = raw[1 : len(raw)-1]
}

此语句用于从字符串的开头和结尾go 掉". {"ckey": "cvalue"}不能删除此字符串中的引号.

然后它调用另一个函数,该函数是一个循环,循环遍历每个字符并判断字符是否为有效字节.

   for i := 0; i < len(raw); i++ {
        if !validCookieValueByte(raw[i]) {
            return "", false
        }
    }

validCookieValueByte个实施

func validCookieValueByte(b byte) bool {
    return 0x20 <= b && b < 0x7f && b != '"' && b != ';' && b != '\\'
}

而这张支票在这里失效了.因为我们在{"ckey": "cvalue"}里有"

让我们用一个示例代码进行判断

func main() {
    router := gin.Default()

    router.GET("/get-cookie", func(c *gin.Context) {
        cookie, err := c.Request.Cookie("key")
        if err != nil {
            c.String(http.StatusBadRequest, err.Error())
            return
        }
        c.String(http.StatusOK, fmt.Sprintf("token = key=%v", cookie.Value))
    })

    router.Run(":8080")
}

这将失败

curl --request GET \
  --url http://localhost:8080/get-cookie \
  --cookie key='{"ckey": "cvalue"}'

但这会成功的

curl --request GET \
  --url http://localhost:8080/get-cookie \
  --cookie key='{ckey: cvalue}'

我们可以使用http.Cookie将cookie设置为json

val := `{"ckey": "cvalue"}`
cookie := &http.Cookie{
    Name:  "key",
    Value: val,
}
http.SetCookie(c.Writer, cookie)

SetCookie将在保存值之前删除".

Go相关问答推荐

Go Fiber和HTMX—HX—Trigger header被更改为HX—Trigger,这不是HTMX监听的内容

消费者在NAT中是如何实现的

Zitadel示例Go Webapp加密密钥

在Go中根据命名空间/字符串生成UUID

mockgen不创建模拟

Websocket服务器实现与x/net库trowing 403

Kusto Go API 从多个表查询

错误!在为 age-viewer-go 运行 wails dev 或 wails build 命令时

获取不带类型参数的泛型 struct 的类型名称

Wire google Inject with multi return from provider 函数

go-libp2p - 从流中接收字节

使用 go.work 文件在多个测试文件上运行 go test 命令

如何使用特定的 Go 版本运行 govulncheck?

使用 oklog/run 来自 Go 编译器的错误(无值)用作值

Go 中 SDL Surface 的 OpenGL 纹理

无限期运行 Go routine (完成后重新启动)

实现接口的指针的泛型类型是什么?

传递上下文的最佳方式

我应该明确地创建一个与Belongs To或Has Many对称的关系吗?

如何发送带有登录数据的 GET 请求并将 cookie 数据保存到 txt 文件?