Pasando valores $ _POST con cURL

94

¿Cómo se pasan $_POSTvalores a una página usando cURL?

Scott Gottreu
fuente

Respuestas:

167

Debería funcionar bien.

$data = array('name' => 'Ross', 'php_master' => true);

// You can POST a file by prefixing with an @ (for <input type="file"> fields)
$data['file'] = '@/home/user/world.jpg';

$handle = curl_init($url);
curl_setopt($handle, CURLOPT_POST, true);
curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
curl_exec($handle);
curl_close($handle)

Tenemos dos opciones aquí, CURLOPT_POSTque activa HTTP POST y CURLOPT_POSTFIELDSque contiene una matriz de nuestros datos de publicación para enviar. Esto se puede utilizar para enviar datos a POST <form>s.


Es importante tener en cuenta que curl_setopt($handle, CURLOPT_POSTFIELDS, $data);toma los $ data en dos formatos y que esto determina cómo se codificarán los datos de la publicación.

  1. $datacomo un array(): Los datos se enviarán como lo multipart/form-dataque no siempre es aceptado por el servidor.

    $data = array('name' => 'Ross', 'php_master' => true);
    curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
  2. $datacomo cadena codificada en URL: los datos se enviarán como application/x-www-form-urlencoded, que es la codificación predeterminada para los datos del formulario html enviado.

    $data = array('name' => 'Ross', 'php_master' => true);
    curl_setopt($handle, CURLOPT_POSTFIELDS, http_build_query($data));

Espero que esto ayude a otros a ahorrar tiempo.

Ver:

Ross
fuente
Tu nota me ahorró al menos una hora de depuración. Gracias.
Vivek Kumar
30

Ross tiene la idea correcta para POSTAR el formato habitual de parámetro / valor en una URL.

Recientemente me encontré con una situación en la que necesitaba PUBLICAR algo de XML como Content-Type "text / xml" sin ningún par de parámetros, así que así es como se hace:

$xml = '<?xml version="1.0"?><stuff><child>foo</child><child>bar</child></stuff>';
$httpRequest = curl_init();

curl_setopt($httpRequest, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($httpRequest, CURLOPT_HTTPHEADER, array("Content-Type:  text/xml"));
curl_setopt($httpRequest, CURLOPT_POST, 1);
curl_setopt($httpRequest, CURLOPT_HEADER, 1);

curl_setopt($httpRequest, CURLOPT_URL, $url);
curl_setopt($httpRequest, CURLOPT_POSTFIELDS, $xml);

$returnHeader = curl_exec($httpRequest);
curl_close($httpRequest);

En mi caso, necesitaba analizar algunos valores del encabezado de respuesta HTTP, por lo que es posible que no necesite establecer CURLOPT_RETURNTRANSFERo CURLOPT_HEADER.

Mark Biek
fuente
1
Esto no es lo que pide el póster, pero resulta ser exactamente lo que estaba buscando, ¡gracias!
Davr
Me alegra que alguien más lo haya encontrado útil.
Mark Biek
1
su "curl_setopt ($ httpRequest, CURLOPT_HTTPHEADER, array (" Content-Type: text / xml "));" ¡Resolví algo que ya me tomó un par de horas! muchas gracias :)
Alexei Tenitski
Hola Mark, si tienes tiempo, ¿podrías ayudarme? .. Por favor. haga clic aquí
jayAnn
Gasté el nuestro tratando de averiguar por qué mis datos xml no fueron aceptados cuando se enviaron con urlencoded. El tipo de contenido y el código de URL no me salvaron. Gracias.
Samuel
3
$query_string = "";

if ($_POST) {
    $kv = array();
    foreach ($_POST as $key => $value) {
        $kv[] = stripslashes($key) . "=" . stripslashes($value);
    }
    $query_string = join("&", $kv);
}

if (!function_exists('curl_init')){
    die('Sorry cURL is not installed!');
}

$url = 'https://www.abcd.com/servlet/';

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, count($kv));
curl_setopt($ch, CURLOPT_POSTFIELDS, $query_string);

curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, FALSE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);

$result = curl_exec($ch);

curl_close($ch);
Sapnandu
fuente
3

Otro ejemplo simple de PHP sobre el uso de cURL:

<?php
    $ch = curl_init();                    // Initiate cURL
    $url = "http://www.somesite.com/curl_example.php"; // Where you want to post data
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_POST, true);  // Tell cURL you want to post something
    curl_setopt($ch, CURLOPT_POSTFIELDS, "var1=value1&var2=value2&var_n=value_n"); // Define what you want to post
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Return the output in string format
    $output = curl_exec ($ch); // Execute

    curl_close ($ch); // Close cURL handle

    var_dump($output); // Show output
?>

Ejemplo encontrado aquí: http://devzone.co.in/post-data-using-curl-in-php-a-simple-example/

En lugar de usar curl_setopt, puede usar curl_setopt_array.

http://php.net/manual/en/function.curl-setopt-array.php

Julian
fuente
¡¡Gracias!! - Su código curl_setopt($ch, CURLOPT_POSTFIELDS, "var1=value1&var2=value2&var_n=value_n"); // Define what you want to postme proporcionó lo que estaba buscando :)
asugrue15
2

Consulte esta página que tiene un ejemplo de cómo hacerlo.

Andy Griffin
fuente
2
Si bien esto teóricamente puede responder a la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia.
Nanne
1
$url='Your url'; // Specify your url
$data= array('parameterkey1'=>value,'parameterkey2'=>value); // Add parameters in key value
$ch = curl_init(); // Initialize cURL
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
curl_close($ch);
Aniket B
fuente
1
¿Podría ampliar esta respuesta? Unas pocas líneas de código no hacen una respuesta.
Rich Benner
1) Especifique su URL 2) Cree una matriz de parámetros 3) Inicialice curl 4) configure las opciones requeridas de curl 5) Ejecute Curl 6) Cierre Curl
Aniket B
0
<?php
    function executeCurl($arrOptions) {

        $mixCH = curl_init();

        foreach ($arrOptions as $strCurlOpt => $mixCurlOptValue) {
            curl_setopt($mixCH, $strCurlOpt, $mixCurlOptValue);
        }

        $mixResponse = curl_exec($mixCH);
        curl_close($mixCH);
        return $mixResponse;
    }

    // If any HTTP authentication is needed.
    $username = 'http-auth-username';
    $password = 'http-auth-password';

    $requestType = 'POST'; // This can be PUT or POST

    // This is a sample array. You can use $arrPostData = $_POST
    $arrPostData = array(
        'key1'  => 'value-1-for-k1y-1',
        'key2'  => 'value-2-for-key-2',
        'key3'  => array(
                'key31'   => 'value-for-key-3-1',
                'key32'   => array(
                    'key321' => 'value-for-key321'
                )
        ),
        'key4'  => array(
            'key'   => 'value'
        )
    );

    // You can set your post data
    $postData = http_build_query($arrPostData); // Raw PHP array

    $postData = json_encode($arrPostData); // Only USE this when request JSON data.

    $mixResponse = executeCurl(array(
        CURLOPT_URL => 'http://whatever-your-request-url.com/xyz/yii',
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPGET => true,
        CURLOPT_VERBOSE => true,
        CURLOPT_AUTOREFERER => true,
        CURLOPT_CUSTOMREQUEST => $requestType,
        CURLOPT_POSTFIELDS  => $postData,
        CURLOPT_HTTPHEADER  => array(
            "X-HTTP-Method-Override: " . $requestType,
            'Content-Type: application/json', // Only USE this when requesting JSON data
        ),

        // If HTTP authentication is required, use the below lines.
        CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
        CURLOPT_USERPWD  => $username. ':' . $password
    ));

    // $mixResponse contains your server response.
Mohammad Faisal Islam
fuente