【问题标题】:Should a server accept & instead of & in an URL get request?服务器应该在 URL 获取请求中接受 & 而不是 & 吗?
【发布时间】:2015-01-23 08:53:33
【问题描述】:

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

示例
我为特定职位尝试了API for getting weather information 并偶然发现了一个问题。我建立了我的 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);

最终到达网址如下所示

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 等)了解到,它们在 URL 中接受 & 而不是 & 并按预期工作。

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

【问题讨论】:

  • 不知何故我无法编辑我的帖子。第一个 URL 应如下所示:http://api.worldweatheronline.com/free/v1/weather.ashx?q=48.13743%2C11.57549&format=json&num_of_days=1&key=APIKEY。参数分隔符应该是& 而不是&。希望能解决问题!
  • 这个问题无法回答清楚,因为您是在征求意见。不,在我看来,服务器一定不能理解任何由调用链早期解析错误导致的 URL 格式。
  • 我认为可能有一个像这样的标准:faqs.org/rfcs/rfc1738.html 告诉我们& 是否应该被服务器接受。但是,如果我对您的理解正确,您会说,在您看来,服务器不应该能够接受&,因为正确的参数分隔符是&? - 支持分享您的意见

标签: php http server server-configuration


【解决方案1】:

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

foo=1&bar=2

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

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

它的行为正确。

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

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

【讨论】:

  • 感谢您的回答。这是我第一次偶然发现他的问题并且我经常使用http_build_query,那么为什么Facebook 和其他API 没有& 而不是& 的问题?不错的答案,点赞!
  • @Musterknabe 他们可能已经让他们的服务器去实体化&s,但这并不是每台服务器都需要或期望的。
  • 感谢您的回答。 http_build_query 使用 & 而不是 & 是否有原因?我真的应该总是传递两个附加参数以确保 URL 没有编码/解码问题吗?
  • @Musterknabe 实际上,& http_build_query 的默认分隔符,如文档 (php.net/manual/en/function.http-build-query.php) 所述并通过快速测试 (3v4l.org/O28nR) 确认)。正如文档页面的 cmets 部分中的某些人所提到的,您的 PHP 版本/构建使用 & 的事实似乎是一个错误。我想你总是手动提供& 是最安全的。
  • 说这个bug的人都有php 5.3,但是我用的是5.5以上的东西(明天可以检查)。如果我的 php 版本创建 & 作为默认参数分隔符,我应该将其报告为错误吗?
猜你喜欢
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 2016-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-26
相关资源
最近更新 更多