web-dev-qa-db-fra.com

PHP + curl, HTTP POST exemple de code?

Quelqu'un peut-il me montrer comment faire un curl php avec un HTTP POST?

Je veux envoyer des données comme ceci:

username=user1, password=passuser1, gender=1

Pour www.domain.com

Je m'attends à ce que curl renvoie une réponse du type result=OK. Y a-t-il des exemples?

435
mysqllearner
<?php
//
// A very simple PHP example that sends a HTTP POST to a remote site
//

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,"http://www.example.com/tester.phtml");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,
            "postvar1=value1&postvar2=value2&postvar3=value3");

// In real life you should use something like:
// curl_setopt($ch, CURLOPT_POSTFIELDS, 
//          http_build_query(array('postvar1' => 'value1')));

// Receive server response ...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$server_output = curl_exec($ch);

curl_close ($ch);

// Further processing ...
if ($server_output == "OK") { ... } else { ... }
?>
742
miku

De procédure

// set post fields
$post = [
    'username' => 'user1',
    'password' => 'passuser1',
    'gender'   => 1,
];

$ch = curl_init('http://www.example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

// execute!
$response = curl_exec($ch);

// close the connection, release resources used
curl_close($ch);

// do anything you want with your response
var_dump($response);

Orienté objet

<?php

// mutatis mutandis
namespace MyApp\Http;

class CurlPost
{
    private $url;
    private $options;

    /**
     * @param string $url     Request URL
     * @param array  $options cURL options
     */
    public function __construct($url, array $options = [])
    {
        $this->url = $url;
        $this->options = $options;
    }

    /**
     * Get the response
     * @return string
     * @throws \RuntimeException On cURL error
     */
    public function __invoke(array $post)
    {
        $ch = curl_init($this->url);

        foreach ($this->options as $key => $val) {
            curl_setopt($ch, $key, $val);
        }

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

        $response = curl_exec($ch);
        $error    = curl_error($ch);
        $errno    = curl_errno($ch);

        if (is_resource($ch)) {
            curl_close($ch);
        }

        if (0 !== $errno) {
            throw new \RuntimeException($error, $errno);
        }

        return $response;
    }
}

Usage

// create curl object
$curl = new \MyApp\Http\CurlPost('http://www.example.com');

try {
    // execute the request
    echo $curl([
        'username' => 'user1',
        'password' => 'passuser1',
        'gender'   => 1,
    ]);
} catch (\RuntimeException $ex) {
    // catch errors
    die(sprintf('Http error %s with code %d', $ex->getMessage(), $ex->getCode()));
}

Remarque secondaire ici: il serait préférable de créer une sorte d’interface appelée AdapterInterface, par exemple avec la méthode getResponse(), et de laisser la classe ci-dessus l’implémenter. Ensuite, vous pouvez toujours échanger cette mise en œuvre avec un autre adaptateur de votre type, sans aucun effet secondaire pour votre application.

Utilisation de HTTPS/chiffrement du trafic

Il y a généralement un problème avec cURL dans PHP sous le système d'exploitation Windows. Lors de la tentative de connexion à un point de terminaison protégé par https, vous obtiendrez une erreur indiquant que certificate verify failed.

Ce que la plupart des gens font ici, c'est dire à la bibliothèque cURL de simplement ignorer les erreurs de certificat et de continuer (curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);). Comme cela fera fonctionner votre code, vous introduisez une énorme faille de sécurité et permettez à des utilisateurs malveillants d’exécuter diverses attaques sur votre application, telles que Man In The Middle attaque ou autre.

Jamais, jamais faire ça. Au lieu de cela, vous devez simplement modifier votre php.ini et indiquer à PHP où votre fichier CA Certificate doit le laisser vérifier les certificats correctement:

; modify the absolute path to the cacert.pem file
curl.cainfo=c:\php\cacert.pem

Le dernier cacert.pem peut être téléchargé à partir d’Internet ou extrait de votre navigateur préféré . Lorsque vous modifiez les paramètres associés à php.ini, n'oubliez pas de redémarrer votre serveur Web.

225
emix

Un exemple concret d'utilisation de php curl_exec pour publier un message HTTP:

Mettez ceci dans un fichier appelé foobar.php:

<?php
  $ch = curl_init();
  $skipper = "luxury assault recreational vehicle";
  $fields = array( 'penguins'=>$skipper, 'bestpony'=>'rainbowdash');
  $postvars = '';
  foreach($fields as $key=>$value) {
    $postvars .= $key . "=" . $value . "&";
  }
  $url = "http://www.google.com";
  curl_setopt($ch,CURLOPT_URL,$url);
  curl_setopt($ch,CURLOPT_POST, 1);                //0 for a get request
  curl_setopt($ch,CURLOPT_POSTFIELDS,$postvars);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
  curl_setopt($ch,CURLOPT_TIMEOUT, 20);
  $response = curl_exec($ch);
  print "curl response is:" . $response;
  curl_close ($ch);
?>

Puis exécutez-le avec la commande php foobar.php, il affiche ce type de sortie dans screen:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Title</title>

<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<body>
  A mountain of content...
</body>
</html>

Alors vous avez envoyé un PHP POST à www.google.com et lui avez envoyé des données.

Si le serveur avait été programmé pour lire les variables de publication, il pourrait décider de faire quelque chose de différent en fonction de cela.

29
Eric Leschinski

Il est facilement accessible avec:

<?php

$post = [
    'username' => 'user1',
    'password' => 'passuser1',
    'gender'   => 1,
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.domain.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
$response = curl_exec($ch);
var_export($response);
23
Vladimir Kovpak

Curl Post + Error Handling + Set Headers [merci à @ mantas-d]:

function curlPost($url, $data=NULL, $headers = NULL) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    if(!empty($data)){
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }

    if (!empty($headers)) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    }

    $response = curl_exec($ch);

    if (curl_error($ch)) {
        trigger_error('Curl Error:' . curl_error($ch));
    }

    curl_close($ch);
    return $response;
}


curlPost('google.com', [
    'username' => 'admin',
    'password' => '12345',
]);
11
MSS
curlPost('google.com', [
    'username' => 'admin',
    'password' => '12345',
]);


function curlPost($url, $data) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $response = curl_exec($ch);
    $error = curl_error($ch);
    curl_close($ch);
    if ($error !== '') {
        throw new \Exception($error);
    }

    return $response;
}
6
Mantas D

Si le formulaire utilise des redirections, une authentification, des cookies, SSL (https) ou toute autre chose qu'un script totalement ouvert attendant des variables POST, vous allez commencer à grincer des dents très rapidement. Jetez un coup d'œil à Snoopy , qui fait exactement ce que vous avez à l'esprit tout en vous évitant d'avoir à configurer beaucoup de temps système.

6
Anthony

Une réponse plus simple SI vous transmettez des informations à votre propre site Web, utilisez une variable SESSION. Commencez la page php avec:

session_start();

Si, à un moment donné, vous souhaitez générer des informations dans PHP et les transmettre à la page suivante de la session, au lieu d'utiliser une variable POST, affectez-la à une variable SESSION. Exemple:

$_SESSION['message']='www.'.$_GET['school'].'.edu was not found.  Please try again.'

Ensuite, à la page suivante, vous faites simplement référence à cette variable SESSION. REMARQUE: après l’avoir utilisé, assurez-vous de le détruire afin qu’il ne persiste pas après son utilisation:

if (isset($_SESSION['message'])) {echo $_SESSION['message']; unset($_SESSION['message']);}
3
user2532795

Voici du code standard pour PHP + curl http://www.webbotsspidersscreenscrapers.com/DSP_download.php

inclure dans ces bibliothèques simplifiera le développement

<?php
# Initialization
include("LIB_http.php");
include("LIB_parse.php");
$product_array=array();
$product_count=0;

# Download the target (store) web page
$target = "http://www.tellmewhenitchanges.com/buyair";
$web_page = http_get($target, "");
    ...
?>
3
AzizSM

Si vous essayez de vous connecter sur le site avec des cookies.

Ce code:

if ($server_output == "OK") { ... } else { ... }

Cela ne fonctionnera peut-être pas si vous essayez de vous connecter, car de nombreux sites renvoient le statut 200, mais la publication échoue.

Un moyen facile de vérifier si le post de connexion a réussi est de vérifier s’il configure à nouveau les cookies. Si la chaîne Set-Cookies est en sortie, cela signifie que les publications n'aboutissent pas et que la nouvelle session démarre.

La publication peut également réussir, mais le statut peut être redirigé à la place 200.

Pour être sûr que le post réussit, essayez ceci:

Suivez la position après la publication, donc il ira à la page où la publication redirige vers:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

Et que de vérifier si de nouveaux cookies existent dans la demande:

if (!preg_match('/^Set-Cookie:\s*([^;]*)/mi', $server_output)) 

{echo 'post successful'; }

else { echo 'not successful'; }
2
Atanas Atanasov

Exemples d'envoi formulaire et brut données:

$curlHandler = curl_init();

curl_setopt_array($curlHandler, [
    CURLOPT_URL => 'https://postman-echo.com/post',
    CURLOPT_RETURNTRANSFER => true,

    /**
     * Specify POST method
     */
    CURLOPT_POST => true,

    /**
     * Specify array of form fields
     */
    CURLOPT_POSTFIELDS => [
        'foo' => 'bar',
        'baz' => 'biz',
    ],
]);

$response = curl_exec($curlHandler);

curl_close($curlHandler);

echo($response);
0
Serge Andriichuk