Javascript用空格替换加号(但不是%20)

时间:2015-05-22 01:29:31

标签: javascript riot-games-api

我正在尝试使用英雄联盟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

3 个答案:

答案 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请求必须符合某些标准。第一行总是由空格分隔的三个部分组成:

  1. 方法(GET,POST等)
  2. 路径(即/api/lol/na/v1.4/summoner/by-name/the%20man)
  3. HTTP版本(HTTP / 1.1,HTTP / 1.0等)
  4. 这通常后面是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作为我的语言来获取它,如果你使用其他东西,你的结果可能需要解码的值)