example - php curl timeout
enrollar el formato POST para CURLOPT_POSTFIELDS (6)
Cuando uso curl
mediante POST
y configuro CURLOPT_POSTFIELD
¿tengo que urlencode
o algún formato especial?
por ejemplo: si quiero publicar 2 campos, primero y último:
first=John&last=Smith
¿Cuál es el código / formato exacto que se debe usar con Curl?
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$reply=curl_exec($ch);
curl_close($ch);
¡No pases una cuerda en absoluto!
Puedes pasar una matriz y dejar que php / curl haga el trabajo sucio de codificación, etc.
De acuerdo con el manual de PHP, los datos pasados a cURL como una cadena deben ser URLencoded. Consulte la página de curl_setopt() y busque CURLOPT_POSTFIELDS
.
En caso de que esté enviando una cadena, urlencode (). De lo contrario, si la matriz, debe ser clave => valor emparejado y el encabezado Content-type
se establece automáticamente en multipart/form-data
.
Además, no tiene que crear funciones adicionales para construir la consulta para sus matrices, ya tiene eso:
$query = http_build_query($data, '''', ''&'');
Esta respuesta me llevó para siempre para encontrar también. Descubrí que todo lo que tienes que hacer es concatenar la URL (''?'' Después del nombre y la extensión del archivo) con la cadena de consulta codificada en URL. Ni siquiera parece que tengas que configurar las opciones de POST CURRICULUM. Vea el ejemplo falso a continuación:
//create URL
$exampleURL = ''http://www.example.com/example.php?'';
// create curl resource
$ch = curl_init();
// build URL-encoded query string
$data = http_build_query(
array(''first'' => ''John'', ''last'' => ''Smith'', ''&''); // set url
curl_setopt($ch, CURLOPT_URL, $exampleURL . $data);
// return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// $output contains the output string
$output = curl_exec($ch);
// close curl resource to free up system resources <br/>
curl_close($ch);
También puede usar file_get_contents()
:
// read entire webpage file into a string
$output = file_get_contents($exampleURL . $data);
Para CURLOPT_POSTFIELDS
, los parámetros se pueden pasar como una cadena urlencoded como para1=val1¶2=val2&..
o como una matriz con el nombre del campo como clave y datos de campo como valor
Pruebe el siguiente formato:
$data = json_encode(array(
"first" => "John",
"last" => "Smith"
));
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$output = curl_exec($ch);
curl_close($ch);
EDITAR : desde php5 hacia arriba, se recomienda el uso de http_build_query
:
string http_build_query ( mixed $query_data [, string $numeric_prefix [,
string $arg_separator [, int $enc_type = PHP_QUERY_RFC1738 ]]] )
Ejemplo simple del manual:
<?php
$data = array(''foo''=>''bar'',
''baz''=>''boom'',
''cow''=>''milk'',
''php''=>''hypertext processor'');
echo http_build_query($data) . "/n";
/* output:
foo=bar&baz=boom&cow=milk&php=hypertext+processor
*/
?>
antes de php5:
Del manual :
CURLOPT_POSTFIELDS
La información completa para publicar en una operación HTTP "POST". Para publicar un archivo, anteponga un nombre de archivo con @ y use la ruta completa. El tipo de archivo se puede especificar explícitamente siguiendo el nombre del archivo con el tipo en el formato ''; type = mimetype''. Este parámetro se puede pasar como una cadena urlencoded como ''para1 = val1 & para2 = val2 & ...'' o como una matriz con el nombre del campo como clave y datos de campo como valor. Si value es una matriz, el encabezado Content-Type se establecerá en multipart / form-data. A partir de PHP 5.2.0, los archivos que pasan a esta opción con el prefijo @ deben estar en forma de matriz para funcionar.
Entonces algo como esto debería funcionar perfectamente (con parámetros pasados en una matriz asociativa):
function preparePostFields($array) {
$params = array();
foreach ($array as $key => $value) {
$params[] = $key . ''='' . urlencode($value);
}
return implode(''&'', $params);
}