查询参数 - 在 golang 中用空白替换 +

Query Param - Replacing + by blank in golang

我正在使用 golang

func (ph *testHandler) GetData() gin.HandlerFunc {
    return func(ctx *gin.Context) {
        params := ctx.Request.URL.Query()
        search = strings.TrimSpace(params.Get("data"))
   } 
}

这里我在 url 中传递 'test+test' 但我得到 'test test'

如何在 golang 中进行查询解析

浏览器将 URL 中的 +%20 符号视为 space 字符,因此查询参数中的 test+test 的值为 test test . 为防止这种情况,您必须在 URL - https://example.com?data=test%2Btest

中手动添加 + 字符文字的 URL 编码值

对于其他 URL 编码值,请参阅 w3schools

如果你查看来源

func (u *URL) Query() Values {
        v, _ := ParseQuery(u.RawQuery)
        return v
}

调用在“encodeQueryComponent”模式下调用 unescape 的 ParseQuery 作为它所做事情的一部分。

此代码片段是相关的

            case '+':
                    if mode == encodeQueryComponent {
                            t.WriteByte(' ')
                    } else {
                            t.WriteByte('+')
                    }

这只是 RFC compliant parsing, 这是正常的行为 你看到的是预期的

https://cs.opensource.google/go/go/+/refs/tags/go1.16.6:src/net/url/url.go;drc=refs%2Ftags%2Fgo1.16.6;l=182

查询参数值中的加号实际上是 URL 编码的 ASCII space。如果你想在后端获得 "test+test",你应该在 URL 的查询参数的值中对加号进行百分号编码:test%2Btest.

一些最小的服务器代码来修复想法:

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", handle)
    if err := http.ListenAndServe(":8080", nil); err != nil {
        log.Fatal(err)
    }
}

func handle(w http.ResponseWriter, r *http.Request) {
    data := r.URL.Query().Get("data")
    w.Header().Set("Content-type", "text/plain")
    fmt.Fprint(w, data)
}

结果:

  • http://localhost:8080/?data=test+test 打印 test test,而
  • http://localhost:8080/?data=test%2Btest 打印 test+test.