0

我正在尝试使用英雄联盟 API 并请求某个用户的数据。我用线

    var user = getUrlVars()["username"].replace("+", " ");

存储用户名。但是,当我使用该用户名执行 XMLHttpRequest 时,它会放置 %20 而不是空格。

y.open("GET", "https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/"+user, false);

编辑:当我使用名称中没有空格的用户运行此代码时,它可以工作,但是当他们的名称中有空格时,它表示用户未定义。

例如,如果我正在寻找用户“男人”,它会在

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
4

3 回答 3

3

创建 URL 时,应使用encodeURIComponent正确编码所有特殊字符:

y.open("GET", "https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/"+encodeURIComponent(user), false);
于 2015-05-22T01:38:12.760 回答
1

实际上,Riot 这边的召唤师名称中没有“空格”。所以:

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

我不确定 + 是如何处理的(事实上我认为你的名字不能有 + )。您所要做的就是删除空格。

对于“有趣”的角色,只需要求他们包含有趣的角色,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 作为我的语言来获取它,如果你使用其他东西,你的结果可能需要解码后的值)

于 2015-06-17T11:08:30.637 回答
0

您遇到的是正确的行为,称为 URL 编码。HTTP 请求必须符合某些标准。第一行总是由以空格分隔的三部分组成:

  1. 方法(GET、POST 等)
  2. 路径(即/api/lol/na/v1.4/summoner/by-name/the%20man)
  3. 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)也可能被解码。希望这可以帮助!

于 2015-05-22T01:46:10.053 回答