http_build_query () без кодировки url

Есть ли способ использовать 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&amp;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&amp;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 = '&'; }