Когда я назначаю массив данных POSTed как параметр cURL (через CURLOPT_POSTFIELDS), мне нужно сначала перенести данные или позаботиться об этом?
C-реализация curl_setopt
, похоже, не кодирует URL- curl_setopt
. Однако в 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 );
Сначала вам не нужно указывать urlencode. Тем не менее, важно понимать, что передача массива сделает cURL отправлять его как multipart/form-data
, что объясняет, почему ему не нужно получать urlencoded (ни вы, ни cURL), и вам нужно использовать массив, если вы хотите загрузить файлы. Если вы http_build_query()
и отправляете его как строку, он будет рассматриваться как application/x-www-form-urlencoded
.
Одна из проблем с использованием массива для CURLOPT_POSTFIELDS заключается в том, что вы не можете иметь пару имя-значение с пустым значением.
Данные POST не добавляются в URL (например, GET), поэтому вам не нужно указывать URL-адрес.
Я использую:
curl_setopt($curl , CURLOPT_POSTFIELDS, $array );
вместо:
curl_setopt($curl , CURLOPT_POSTFIELDS, http_build_query($array) );