Php 服务器是否应该接受&;amp;而不是&;在URL get请求中?
简介Php 服务器是否应该接受&;amp;而不是&;在URL get请求中?,php,http,server,server-configuration,Php,Http,Server,Server Configuration,简介 我会给你举个例子,这样我的问题可能更容易理解。我不需要编程方面的“帮助”,只需要关于这个主题的信息 示例 我试着找一个特定的职位,但偶然发现了一个问题。我构建url以请求如下数据: $params['q'] = $latitude .','. $longitude; // 48.14,11.58 $params['format'] = $format; //json $params['num_of_days'] = $numOfDays; //1 $pa
我会给你举个例子,这样我的问题可能更容易理解。我不需要编程方面的“帮助”,只需要关于这个主题的信息 示例
我试着找一个特定的职位,但偶然发现了一个问题。我构建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);
foo=1&bar=2
最终的URL如下所示
但是,当使用cURL请求此URL的数据时,我收到了一个错误,即没有提供api密钥。正如我发现的,问题在于的使用&代码>URL中的符号。当我使用http\u build\u query
方法时,如下所示:
$url.='?'。http_build_查询($params,null,&')代码>
URL如下所示:
问题
现在我想问的是,这是否是服务器的预期行为。我从其他几个API(Facebook、Foursquare等)知道他们接受&代码>而不是URL中的&
,并按预期工作
有标准吗?服务器是否能够接受&
还是接受它是“错误的”,应该只接受&
?谢谢 HTML实体,如&代码>不是URI规范的一部分。就相关而言,&
是一个子定界字符,因此,如果服务器接收到如下查询字符串:
$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);
foo=1&bar=2
并将其解析为以下键值对:
'foo' => '1',
'amp;bar' => '2'
它的行为是正确的
为了让事情变得更有趣,
也是保留的子分隔符,但:
如果在URI组件中找到保留字符且没有定界
角色是该角色的已知角色,则必须将其解释为
表示对应于该字符编码的数据八位字节
在US-ASCII中
HTML实体,如&代码>不是URI规范的一部分。就相关而言,&
是一个子定界字符,因此,如果服务器接收到如下查询字符串:
$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);
foo=1&bar=2
并将其解析为以下键值对:
'foo' => '1',
'amp;bar' => '2'
它的行为是正确的
为了让事情变得更有趣,
也是保留的子分隔符,但:
如果在URI组件中找到保留字符且没有定界
角色是该角色的已知角色,则必须将其解释为
表示对应于该字符编码的数据八位字节
在US-ASCII中
不知何故,我无法编辑我的帖子。第一个URL应该如下所示:http://api.worldweatheronline.com/free/v1/weather.ashx?q=48.13743%2C11.57549&格式=json&;天数=1&;key=APIKEY
。参数分隔符应为&代码>不是&
。希望能澄清一些事情!这个问题无法明确回答,因为你在征求意见。不,在我看来,服务器不能理解任何URL格式,这些格式是由于调用链早期的解析错误导致的代码>是否应被服务器接受。但如果我理解正确,您会说,您认为服务器不应该接受&因为正确的参数分隔符是&
?-我投票赞成分享你的观点,比如我不能编辑我的帖子。第一个URL应该如下所示:http://api.worldweatheronline.com/free/v1/weather.ashx?q=48.13743%2C11.57549&格式=json&;天数=1&;key=APIKEY
。参数分隔符应为&代码>不是&
。希望能澄清一些事情!这个问题无法明确回答,因为你在征求意见。不,在我看来,服务器不能理解任何URL格式,这些格式是由于调用链早期的解析错误导致的代码>是否应被服务器接受。但如果我理解正确,您会说,您认为服务器不应该接受&因为正确的参数分隔符是&
?-投票赞成分享你的观点,赞成答案。这是我第一次偶然发现这个问题,而且我经常使用http\u build\u query
,那么Facebook和其他API为什么没有的问题呢代码>而不是&
?回答得好,投了赞成票@必须知道的是,他们可能已经让他们的服务器去实体化了&代码>s,但这不是每个服务器都需要或期望的。谢谢您的回答。http\u build\u查询使用有什么原因吗&代码>而不是&
?我真的应该始终传递两个附加参数以确保URL没有编码/解码问题吗?@Musterknabe实际上,&
是http\u build\u query
的默认分隔符,如文档()所述,并通过快速测试()确认。您的PHP版本/构建使用&
似乎是一个bug,正如一些人在文档页面的评论部分提到的那样。我想你总是手动提供&
是最安全的。声明此错误的人都有PHP5.3,但我使用的是5.5以上的sth(可以明天查看)。如果我的php版本创建了,我是否应该将其报告为bug代码>作为默认参数分隔符?谢谢您的回答。这是我第一次偶然发现这个问题,而且我经常使用http\u build\u query
,那么Facebook和其他API为什么没有的问题呢代码>而不是&
?回答得好,投了赞成票@必须知道的是,他们可能已经让他们的服务器去实体化了&代码>s,但这不是每个服务器都需要或期望的。谢谢您的回答。http\u build\u查询使用有什么原因吗&代码>而不是&