Как отправить массив с CURL? Должен ли я `urlencode` это? - PullRequest
18 голосов
/ 22 февраля 2009

Когда я присваиваю массив данных, которые будут POSTed в качестве опции cURL (через CURLOPT_POSTFIELDS), нужно ли мне сначала кодировать эти данные или об этом позаботятся?

Ответы [ 5 ]

30 голосов
/ 22 февраля 2009

Реализация C на curl_setopt, похоже, не кодирует URL-адрес текста. Однако в PHP5 функция http_build_query возвращает строковое представление массива, который имеет URL-кодирование.

Пример использования

  $curl_parameters = array(
    'param1' => $param1,
    'param2' => $param2
  );

  $curl_options = array(
    CURLOPT_URL => "http://localhost/service",
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query( $curl_parameters ),
    CURLOPT_HTTP_VERSION => 1.0,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER => false
  );

  $curl = curl_init();
  curl_setopt_array( $curl, $curl_options );
  $result = curl_exec( $curl );

  curl_close( $curl );
14 голосов
/ 22 февраля 2009

Вам не нужно сначала кодировать urlencode. Тем не менее, важно понимать, что передача массива заставит cURL отправить его как multipart/form-data, что объясняет, почему нет необходимости получать urlencoded (ни вами, ни cURL), и вам нужно использовать массив, если вы хотите загружать файлы. Если вы сначала http_build_query() (и отправите его как строку), это будет рассматриваться как application/x-www-form-urlencoded.

1 голос
/ 22 февраля 2009

Одна проблема с использованием массива для CURLOPT_POSTFIELDS заключается в том, что у вас не может быть пары имя-значение с пустым значением.

0 голосов
/ 22 ноября 2017

Я использую:

curl_setopt($curl , CURLOPT_POSTFIELDS, $array );

вместо:

curl_setopt($curl , CURLOPT_POSTFIELDS, http_build_query($array)  );
0 голосов
/ 22 февраля 2009

Данные POST не добавляются в URL (например, GET), поэтому вам не нужно кодировать их URL.

...