您遇到的是正确的行为,称为 URL 编码。HTTP 请求必须符合某些标准。第一行总是由以空格分隔的三部分组成:
- 方法(GET、POST 等)
- 路径(即/api/lol/na/v1.4/summoner/by-name/the%20man)
- HTTP 版本(HTTP/1.1、HTTP/1.0 等)
这通常后面是 HTTP 标头,我暂时将其省略,因为它超出了您的问题范围(如果有兴趣,请阅读此https://www.rfc-editor.org/rfc/rfc7230)。所以一个正常的请求是这样的:
GET /api/lol/na/v1.4/summoner/by-name/the%20man HTTP/1.1
Host: na.api.pvp.net
User-Agent: Mozilla
...
关于您的原始问题,库将空间编码为 URL 的原因%20
是您在请求行中不能有空格字符。否则,您将抛弃大多数 HTTP 消息解析器,因为它们man
会像这样替换 HTTP 版本行:
GET /api/lol/na/v1.4/summoner/by-name/the man HTTP/1.1
Host: na.api.pvp.net
User-Agent: Mozilla
...
在大多数情况下,服务器会返回 400 bad request 响应,因为它们不明白 HTTP 版本man
指的是什么。然而,没有什么好担心的,大多数服务器端应用程序/框架在处理 HTTP 请求中的数据之前会自动解码%20
或+
到空间。因此,即使您的 URL 看起来不寻常,服务器端也会将其处理为the man
.
最后,要注意的最后一件事。您不应该使用String.replace()
to URL 解码您的消息。相反,您应该分别使用 decodeURI() 和 encodeURI() 来解码和编码字符串。例如:
var user = getUrlVars()["username"].replace("+", " ");
变成
var user = decodeURI(getUrlVars()["username"]);
这确保了包含特殊字符的用户名(例如/
URL 编码为%2f
)也可能被解码。希望这可以帮助!