服务器应该接受&而不是&在URL获取请求?

时间:2014-11-25 11:19:57

标签: php http server server-configuration

INTRO
我会举个例子,所以我的问题可能更容易理解。我在编程问题上不需要“帮助”,只需要关于这个主题的信息!

示例
我为一个特定的位置尝试了API for getting weather information并偶然发现了一个问题。我建立了我的网址来请求这样的数据:

$params['q']            = $latitude .','. $longitude; // 48.14,11.58
$params['format']       = $format; //json
$params['num_of_days']  = $numOfDays; //1
$params['key']          = self::APIKEY;

$url = 'http://api.worldweatheronline.com/free/v1/weather.ashx'
$url .= '?'. http_build_query($params);

最终的网址看起来像这样

http://api.worldweatheronline.com/free/v1/weather.ashx?q=48.13743%2C11.57549&format=json&num_of_days=1&key=APIKEY

但是,当使用cURL请求此URL的数据时,我收到了错误,即没有提供api-key。正如我发现的那样,问题是在URL中使用了&个符号。当我使用http_build_query这样的方法时:

$url .= '?'. http_build_query($params, null, '&');

网址如下所示:http://api.worldweatheronline.com/free/v1/weather.ashx?q=48.13743%2C11.57549&format=json&num_of_days=1&key=APIKEY

问题
现在我要问的是,这是否是来自服务器的预期行为。我从其他几个API(Facebook,Foursquare等)了解到,他们在网址中接受&而不是&,并按预期工作。

有标准吗?服务器是否应该接受&或接受它是“错误”,并且只应接受&?谢谢!

1 个答案:

答案 0 :(得分:5)

&这样的HTML实体不是URI规范的一部分。就RFC 3986而言,&是一个子分隔符,因此如果服务器收到这样的查询字符串:

foo=1&bar=2

并将其解析为以下键值对:

'foo' => '1',
'amp;bar' => '2'

表现正常。

为了使事情变得更有趣,;也是一个保留的子分隔符,但是:

  

如果在URI组件中找到保留字符且没有分隔符   角色对于该角色是已知的,那么它必须被解释为   表示与该字符的编码对应的数据八位字节   在US-ASCII。