查询参数 - 在 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, 这是正常的行为
你看到的是预期的
查询参数值中的加号实际上是 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
.
我正在使用 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, 这是正常的行为 你看到的是预期的
查询参数值中的加号实际上是 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
.