在 HTTP GET 请求中,如果查询参数(Query Parameters)中包含特殊字符(如 %),这些字符需要进行 URL 编码(URLEncode),以确保它们能够正确传输并被服务器解析。

1. URL 编码处理过程:

URL 编码(Percent-Encoding)会将特殊字符转换为 % 后跟两个十六进制数字。例如:

  • % 本身在 URLEncode 中会被编码为 %25
  • 如果参数值是 "%",那么编码后的结果是 "%25"

其他特殊字符示例:

  • 空格 ( ) 会被编码为 %20+(两种方式)
  • & 会编码为 %26
  • = 会编码为 %3D

2. 客户端发送如何处理?

当构造 HTTP GET 请求时,如果其中的参数包含 %,需要对它进行 URL 编码。例如:

package main

import (
    "fmt"
    "net/url"
)

func main() {
    query := "param1=value%param2=value"
    encodedQuery := url.QueryEscape(query)

    fmt.Println(encodedQuery) // 输出: param1=value%25param2=value
}

在上面的例子中,value% 中的 % 被替换为 %25

最终发送的 URL 可能看起来是这样的:

GET /?query=param1%3Dvalue%2526param2%3Dvalue HTTP/1.1
Host: example.com

3. 服务器如何解析?

在 HTTP 请求中,服务器接收到的 URL 参数是经过编码的字符串。服务器会对 URL 中的查询参数进行 URL 解码,将其还原为原始的值。

具体操作通常由服务器框架自动处理。例如在 Golang 基于 net/http 处理请求时:

package main

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

func handler(w http.ResponseWriter, r *http.Request) {
    // 获取查询参数
    encodedQuery := r.URL.RawQuery
    fmt.Println("Encoded Query:", encodedQuery)

    // 解码查询参数
    decodedQuery, _ := url.QueryUnescape(encodedQuery)
    fmt.Println("Decoded Query:", decodedQuery)

    fmt.Fprintln(w, "Processed Query Successfully")
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

请求:

GET /?query=param1%3Dvalue%2526param2%3Dvalue HTTP/1.1
Host: localhost:8080

服务器输出:

Encoded Query: query=param1%3Dvalue%2526param2%3Dvalue
Decoded Query: query=param1=value%&param2=value

总结:

  1. % 会在 URL 编码中变成 %25
  2. 服务器会自动解码收到的查询参数,将 %25 还原为 %
  3. URL 编码和解码是 HTTP 请求的基本机制,各种框架和 SDK 一般都会自动处理这些步骤。

如果在解码过程中出现特殊字符编码错误(例如 % 后不是两个合法的十六进制字符),服务器会报错或丢弃该参数。需要确保在编码阶段正确处理输入以避免问题。



HTTP Get请求中,如果get参数中有%,URLEncode时会怎么处理,服务器接收时如何解析出来插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:https://choupangxia.com/2025/08/02/http-get/