Есть ли способ использовать http_build_query()
без кодировки URL в соответствии с некоторым стандартом RFC?
Почему я не хочу, чтобы URL-адрес закодировал все: я обращаюсь к API Ebay. Они честно настаивают на том, чтобы имена параметров не были закодированы в URL, а в скобках – запятые. Например, DomainName (0) является параметром, и запрос терпит неудачу, если эти парсеры закодированы.
Вы можете использовать urldecode()
в строке результата, которую вы получаете из http_build_query()
Нет, кажется, он всегда хочет кодировать (что должно быть, оно предназначено для кодирования URL при создании списка параметров для URL-адреса).
Вы можете сделать свой собственный …
$params = array('a' => 'A', 'b' => 'B'); $paramsJoined = array(); foreach($params as $param => $value) { $paramsJoined[] = "$param=$value"; } $query = implode('&', $paramsJoined);
CodePad .
Вместо этого вы можете попробовать использовать JSON API. Я попытался получить рабочий образец, но у меня нет имени приложения, поэтому я не могу проверить результат. Вот код:
<?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 () является INVALID без urlencoding. Может быть, вы случайно его дважды закодируете? Например, попробуйте создать HTTP-запрос для этого массива:
$params = array('a' => 'a&b=b');
Без кодирования вы бы получили
a=a&b=b
При правильном кодировании вы получите
a=a%26b%3Db
что правильно. Если вы пропустите кодировку, обязательно избегайте атак с использованием URL-адресов.
PHP 5.3.1 (Buggy Behavior) http_build_query Убирает символ '&' ampersand, который объединяет параметры. Пример: user_id=1&setting_id=2
.
PHP 5.4+ http_build_query НЕ УДАЛЯЕТ символ «&» ampersand, который объединяет параметры. Пример: 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
Вариант №1: Напишите функцию обертки:
/** * This will work consistently and will never escape the '&' character */ function buildQuery($params) { return http_build_query($params, '', '&'); }
Вариант № 2: Отключите функцию http_build_query и напишите свой собственный.
Вы можете использовать urldecode () . Или используйте http_build_query с аргументом $ arg_separator .
$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 : если индексы массива являются числами, эта строка добавляется как префикс в каждом индексе. В этом случае « test_0 = bar» .
arg_separator : используется для разделения аргументов. Если non предоставляется php, используйте arg_separator.output, разлитый в php.ini
См. Php http_build_query
я беру ответ на alex, но быстрее
$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 = '&'; }