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:

分隔
  1. 方法(GET、POST 等)
  2. 路径(即/api/lol/na/v1.4/summoner/by-name/the%20man)
  3. 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 作为我的语言来获取它,如果您使用其他语言,您的结果可能需要解码值)