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?
<?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 { ... }
?>
// 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);
<?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;
}
}
// 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.
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.
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.
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);
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',
]);
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;
}
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.
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']);}
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, "");
...
?>
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'; }
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);