Passer des valeurs $ _POST avec cURL

94

Comment passez-vous des $_POSTvaleurs à une page en utilisant cURL?

Scott Gottreu
la source

Réponses:

167

Cela devrait fonctionner correctement.

$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)

Nous avons deux options ici, CURLOPT_POSTqui active HTTP POST et CURLOPT_POSTFIELDSqui contient un tableau de nos données de publication à soumettre. Cela peut être utilisé pour soumettre des données à l' POST <form>art.


Il est important de noter que curl_setopt($handle, CURLOPT_POSTFIELDS, $data);prend les données $ dans deux formats, et que cela détermine comment les données de publication seront encodées.

  1. $dataen tant que array(): Les données seront envoyées comme multipart/form-datace qui n'est pas toujours accepté par le serveur.

    $data = array('name' => 'Ross', 'php_master' => true);
    curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
  2. $dataas url encoded string: Les données seront envoyées en tant que application/x-www-form-urlencoded, qui est l'encodage par défaut pour les données de formulaire HTML soumises.

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

J'espère que cela aidera les autres à gagner du temps.

Voir:

Ross
la source
Votre note m'a sauvé au moins une heure de débogage. Merci.
Vivek Kumar le
30

Ross a la bonne idée pour POSTER le format de paramètre / valeur habituel dans une URL.

Je suis récemment tombé sur une situation où je devais POSTER du XML en tant que Content-Type «text / xml» sans aucune paire de paramètres, alors voici comment procéder:

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

Dans mon cas, j'avais besoin d'analyser certaines valeurs de l'en-tête de réponse HTTP afin que vous n'ayez pas nécessairement besoin de définir CURLOPT_RETURNTRANSFERou CURLOPT_HEADER.

Mark Biek
la source
1
Ce n'est pas ce que demande l'affiche, mais c'est exactement ce que je cherchais, merci!
davr
Je suis content que quelqu'un d'autre l'ait trouvé utile.
Mark Biek le
1
votre "curl_setopt ($ httpRequest, CURLOPT_HTTPHEADER, array (" Content-Type: text / xml "));" résolu quelque chose qui m'a déjà pris quelques heures! merci beaucoup :)
Alexei Tenitski
Salut Mark, si vous avez le temps, pourriez-vous m'aider s'il vous plaît? .. S'il vous plaît. cliquez ici
jayAnn
Nous avons passé le nôtre à essayer de comprendre pourquoi mes données XML n'étaient pas acceptées lorsqu'elles étaient envoyées comme urlencodées. Le Content-Type et aucun urlencode m'ont sauvé. Merci.
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
la source
3

Un autre exemple PHP simple d'utilisation 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
?>

Exemple trouvé ici: http://devzone.co.in/post-data-using-curl-in-php-a-simple-example/

Au lieu d'utiliser, curl_setoptvous pouvez utilisercurl_setopt_array .

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

julien
la source
Je vous remercie!! - Votre code curl_setopt($ch, CURLOPT_POSTFIELDS, "var1=value1&var2=value2&var_n=value_n"); // Define what you want to postm'a fourni ce que je cherchais :)
asugrue15
2

Consultez cette page qui a un exemple de la façon de le faire.

Andy Griffin
la source
2
Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure ici les parties essentielles de la réponse et de fournir le lien pour référence.
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
la source
1
Pourriez-vous développer cette réponse? Quelques lignes de code ne font pas de réponse.
Rich Benner
1) Spécifiez votre URL 2) Créez un tableau de paramètres 3) Initialisez curl 4) Définissez les options requises de curl 5) Exécutez Curl 6) Fermez 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
la source