Javascript 将加号替换为 space(但不是 %20)
Javascript replace plus sign with space (but not %20)
我正在尝试使用英雄联盟 API 并请求特定用户的数据。我用线
var user = getUrlVars()["username"].replace("+", " ");
存储用户名。但是,当我使用该用户名执行 XMLHttpRequest 时,它将放置 %20 而不是 space。
y.open("GET", "https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/"+user, false);
编辑:当我 运行 这个代码与一个名字中没有 space 的用户一起使用时,它有效,但是当他们的名字中有一个 space 时,它说用户未定义。
例如,如果我正在寻找用户 "the man",它会执行 get at
https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/the%20man
但正确的要求URL是
https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/the man
创建 URL 时,您应该使用 encodeURIComponent
正确编码所有特殊字符:
y.open("GET", "https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/"+encodeURIComponent(user), false);
您遇到的是正确的行为,称为 URL 编码。 HTTP 请求必须符合某些标准。第一行总是由三部分组成,由 space:
分隔
- 方法(GET、POST 等)
- 路径(即/api/lol/na/v1.4/summoner/by-name/the%20man)
- HTTP 版本(HTTP/1.1、HTTP/1.0 等)
这通常跟在 HTTP headers 之后,我暂时将其省略,因为它超出了您的问题范围(如果有兴趣,请阅读此 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 将 space 编码为 %20
的原因是您不能在请求中包含 space 字符线。否则,您将放弃大多数 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
...
在大多数情况下,服务器将 return 400 错误请求响应,因为它们不理解 man
指的是什么 HTTP 版本。然而,不用担心,大多数 server-side applications/frameworks 在处理 HTTP 请求中的数据之前会自动将 %20
或 +
解码为 space。因此,即使您的 URL 看起来不正常,服务器端也会将其处理为 the man
.
最后,要注意的最后一件事。您不应该使用 String.replace()
到 URL 解码您的消息。相反,您应该分别使用 decodeURI() 和 encodeURI() 对字符串进行解码和编码。例如:
var user = getUrlVars()["username"].replace("+", " ");
变成
var user = decodeURI(getUrlVars()["username"]);
这确保包含特殊字符的用户名(如 /
将被 URL 编码为 %2f
)也可能被解码。希望这对您有所帮助!
实际上拳头那边的召唤师名字里没有"spaces"。所以:
https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/the man
变为:
https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/theman
看看这个:https://developer.riotgames.com/discussion/community-discussion/show/jomoRum7
我不确定 + 是如何处理的(事实上我认为你的名字中不能有 +)。您所要做的就是删除空格。
对于 "funny" 个角色,只需请求其中包含有趣角色的角色,Riot 就可以正常返回。
https://euw.api.pvp.net/api/lol/euw/v1.4/summoner/by-name/Trøyer?api_key=<insert your own>
将自动更正为
https://euw.api.pvp.net/api/lol/euw/v1.4/summoner/by-name/Tr%C3%B8yer?api_key=<insert your own>
而且您通常甚至不必对其进行解码。 (我使用 JS 作为我的语言来获取它,如果您使用其他语言,您的结果可能需要解码值)
我正在尝试使用英雄联盟 API 并请求特定用户的数据。我用线
var user = getUrlVars()["username"].replace("+", " ");
存储用户名。但是,当我使用该用户名执行 XMLHttpRequest 时,它将放置 %20 而不是 space。
y.open("GET", "https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/"+user, false);
编辑:当我 运行 这个代码与一个名字中没有 space 的用户一起使用时,它有效,但是当他们的名字中有一个 space 时,它说用户未定义。
例如,如果我正在寻找用户 "the man",它会执行 get at
https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/the%20man
但正确的要求URL是
https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/the man
创建 URL 时,您应该使用 encodeURIComponent
正确编码所有特殊字符:
y.open("GET", "https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/"+encodeURIComponent(user), false);
您遇到的是正确的行为,称为 URL 编码。 HTTP 请求必须符合某些标准。第一行总是由三部分组成,由 space:
分隔- 方法(GET、POST 等)
- 路径(即/api/lol/na/v1.4/summoner/by-name/the%20man)
- HTTP 版本(HTTP/1.1、HTTP/1.0 等)
这通常跟在 HTTP headers 之后,我暂时将其省略,因为它超出了您的问题范围(如果有兴趣,请阅读此 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 将 space 编码为 %20
的原因是您不能在请求中包含 space 字符线。否则,您将放弃大多数 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
...
在大多数情况下,服务器将 return 400 错误请求响应,因为它们不理解 man
指的是什么 HTTP 版本。然而,不用担心,大多数 server-side applications/frameworks 在处理 HTTP 请求中的数据之前会自动将 %20
或 +
解码为 space。因此,即使您的 URL 看起来不正常,服务器端也会将其处理为 the man
.
最后,要注意的最后一件事。您不应该使用 String.replace()
到 URL 解码您的消息。相反,您应该分别使用 decodeURI() 和 encodeURI() 对字符串进行解码和编码。例如:
var user = getUrlVars()["username"].replace("+", " ");
变成
var user = decodeURI(getUrlVars()["username"]);
这确保包含特殊字符的用户名(如 /
将被 URL 编码为 %2f
)也可能被解码。希望这对您有所帮助!
实际上拳头那边的召唤师名字里没有"spaces"。所以:
https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/the man
变为:
https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/theman
看看这个:https://developer.riotgames.com/discussion/community-discussion/show/jomoRum7
我不确定 + 是如何处理的(事实上我认为你的名字中不能有 +)。您所要做的就是删除空格。
对于 "funny" 个角色,只需请求其中包含有趣角色的角色,Riot 就可以正常返回。
https://euw.api.pvp.net/api/lol/euw/v1.4/summoner/by-name/Trøyer?api_key=<insert your own>
将自动更正为
https://euw.api.pvp.net/api/lol/euw/v1.4/summoner/by-name/Tr%C3%B8yer?api_key=<insert your own>
而且您通常甚至不必对其进行解码。 (我使用 JS 作为我的语言来获取它,如果您使用其他语言,您的结果可能需要解码值)