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);
}