http_build_query()没有url编码
有没有一种方法可以使用http_build_query()
而无需根据某些RFC标准进行URL编码?
为什么我不想要URL编码的一切:我查询Ebay API ..他们诚实地坚持参数名称不是URL编码,就像括号中的逗号。 例如DomainName(0)是一个参数,如果这些parens被编码,则查询失败。
你可以对从http_build_query()
得到的结果string使用urldecode()
函数,
不,它似乎总是要编码(它应该,这意味着当build立一个URL的参数列表时,URL编码)。
你可以做你自己的…
$params = array('a' => 'A', 'b' => 'B'); $paramsJoined = array(); foreach($params as $param => $value) { $paramsJoined[] = "$param=$value"; } $query = implode('&', $paramsJoined);
CodePad 。
你可能想尝试他们的JSON API。 我试图得到一个工作示例,但我没有应用程序名称,所以我无法validation结果。 代码如下:
<?php $appName = "Your App Name Here"; $post_data = array( 'jsonns.xsi' => 'http://www.w3.org/2001/XMLSchema-instance', 'jsonns.xs' => 'http://www.w3.org/2001/XMLSchema', 'jsonns.tns' => 'http://www.ebay.com/marketplace/search/v1/services', 'tns.findItemsByKeywordsRequest' => array( 'keywords' => 'harry potter pheonix' ) ); $headers = array( "X-EBAY-SOA-REQUEST-DATA-FORMAT: JSON", "X-EBAY-SOA-RESPONSE-DATA-FORMAT: JSON", "X-EBAY-SOA-OPERATION-NAME: findItemsByKeywords", "X-EBAY-SOA-SECURITY-APPNAME: $appName" ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://svcs.ebay.com/services/search/FindingService/v1'); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); if($result) { $response = json_decode($result); } curl_close($ch); ?>
你需要填写任何应用程序名称的$appName
。 另外, X-EBAY-SOA-OPERATION-NAME
将需要设置为实际的呼叫,如果呼叫不同,JSON将被修改。
http_build_query()在没有urlencoding的情况下是无效的。 也许你不小心对它进行了双重编码? 例如,尝试为这个数组构buildhttp查询:
$params = array('a' => 'a&b=b');
没有编码,你会得到
a=a&b=b
当正确的编码,你会得到
a=a%26b%3Db
哪个是对的。 如果你跳过编码,一定要避免URL注入攻击。
PHP 5.3.1(Buggy Behavior) http_build_query是否转义连接参数的“&”符号字符。 例如: user_id=1&setting_id=2
。
PHP 5.4 + http_build_query 不会转义连接参数的“&”符号。 例如: user_id=1&setting_id=2
例:
$params = array( 'user_id' => '1', 'setting_id' => '2' ); echo http_build_query($params); // Output for PHP 5.3.1: user_id=1&setting_id=2 // NOTICE THAT: '&' character is escaped // Output for PHP 5.4.0+: user_id=1&setting_id=2 // NOTICE THAT: '&' character is NOT escaped
针对多个版本的解决scheme
选项#1:写封装函数:
/** * This will work consistently and will never escape the '&' character */ function buildQuery($params) { return http_build_query($params, '', '&'); }
选项#2:消除http_build_query函数并编写自己的。
你可以使用urldecode() 。 或者用$ arg_separator参数使用http_build_query。
$query_data= $data = array('bar', 'baz'=>'boom'); $numeric_prefix= 'test_'; $arg_separator = '&'; $http_query = http_build_query ( $query_data, $numeric_prefix, $arg_separator ); var_dump( $http_query );
上面的输出是
string 'test_0=bar&baz=boom' (length=19)
numeric_prefix :如果数组索引是数字,则将该string作为每个索引中的前缀添加。 在这种情况下,' test_0 = bar' 。
arg_separator :用于分隔参数。 如果非给定php使用在php.ini中定义的arg_separator.output
请参阅php http_build_query
我接受亚历克斯的答案,但速度更快
$params = array('a' => 'A', 'b' => 'B'); $query = ''; foreach ($params as $param => $value) { $query .= $param.'='.$value .'&'; } echo substr($query, 0, -1);
这也可以工作
$fields = array( 'a' => 'A', 'b' => 'B' ); $separator = ''; foreach($fields as $key=>$value) { $fields_string .= $separator . $key . '=' . $value; $separator = '&'; }