我正在尝试使用英雄联盟API并向某个用户请求数据。我用这行
'1904-01-01'
存储用户名。但是,当我使用该用户名执行XMLHttpRequest时,它会放置%20而不是空格。
var user = getUrlVars()["username"].replace("+", " ");
编辑:当我使用名称中没有空格的用户运行此代码时,它可以工作,但是当他们的名称中有空格时,它表示用户未定义。
例如,如果我正在寻找用户"那个男人",那就可以了解
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
答案 0 :(得分:2)
在创建网址时,您应该使用encodeURIComponent
对所有特殊字符进行正确编码:
y.open("GET", "https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/"+encodeURIComponent(user), false);
答案 1 :(得分:0)
您遇到的是正确的行为,称为URL编码。 HTTP请求必须符合某些标准。第一行总是由空格分隔的三个部分组成:
这通常后面是HTTP标题,我将暂时遗漏,因为它超出了您的问题的范围(如果有兴趣,请阅读此https://tools.ietf.org/html/rfc7230)。所以正常的请求看起来像这样:
%20
关于您的原始问题,库是将空格编码为man
的原因是因为您在请求行中没有空格字符。否则,您将丢弃大多数HTTP消息解析器,因为GET /api/lol/na/v1.4/summoner/by-name/the man HTTP/1.1
Host: na.api.pvp.net
User-Agent: Mozilla
...
将替换HTTP版本行,如下所示:
man
在大多数情况下,服务器将返回400错误的请求响应,因为他们无法理解HTTP版本%20
所指的内容。但是,没有什么可担心的,大多数服务器端应用程序/框架会在处理HTTP请求中的数据之前自动将+
或the man
解码为空间。因此,即使您的网址看起来不寻常,服务器端也会将其处理为String.replace()
。
最后,最后要注意的一件事。您不应该使用var user = getUrlVars()["username"].replace("+", " ");
对邮件进行URL解码。相反,您应该分别使用decodeURI()和encodeURI()来解码和编码字符串。例如:
var user = decodeURI(getUrlVars()["username"]);
变为
/
这可以确保包含特殊字符(如%2f
的URL编码为{{1}})的用户名也可能被解码。希望这有帮助!
答案 2 :(得分:0)
实际上没有"空格"在Riot's方面的召唤者名字中。所以:
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作为我的语言来获取它,如果你使用其他东西,你的结果可能需要解码的值)