0

INTRO
我会给你一个例子,这样我的问题可能会更好理解。我在编程方面不需要“帮助”,只需要关于这个主题的信息!

示例
我尝试了一个用于获取特定位置的天气信息的 API,但偶然发现了一个问题。我建立了我的 url 来请求这样的数据:

$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);

最终 URL 如下所示

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, '&');

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

问题
现在我想问的是,这是否是服务器的预期行为。我从其他几个 API(Facebook、Foursquare 等)知道他们接受&而不是&在 URL 中接受并按预期工作。

有标准吗?服务器应该能够接受&还是接受它是“错误的”并且应该只&被接受?谢谢!

4

1 回答 1

5

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

foo=1&bar=2

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

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

它的行为正确。

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

如果在 URI 组件中找到保留字符,并且不知道该字符的定界角色,则必须将其解释为表示对应于 US-ASCII 中该字符编码的数据八位字节。

于 2014-11-25T11:50:24.087 回答