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()));
}
Note latérale ici: il serait préférable de créer une sorte d'interface appelée AdapterInterface
par exemple avec la getResponse()
méthode et de laisser la classe ci-dessus l'implémenter. Ensuite, vous pouvez toujours échanger cette implémentation avec un autre adaptateur de votre choix, sans aucun effet secondaire sur votre application.
Utilisation de HTTPS / chiffrement du trafic
Habituellement, il y a un problème avec cURL en PHP sous le système d'exploitation Windows. En essayant de vous connecter à un point de terminaison protégé par https, vous obtiendrez une erreur vous le disant certificate verify failed
.
Ce que la plupart des gens font ici, c'est de dire à la bibliothèque cURL d'ignorer simplement les erreurs de certificat et de continuer ( curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
). Comme cela fera fonctionner votre code, vous introduisez un énorme trou de sécurité et permettez aux utilisateurs malveillants d'effectuer diverses attaques sur votre application comme l' attaque Man In The Middle ou autre.
Ne fais jamais ça. Au lieu de cela, il vous suffit de modifier votre php.ini
et de dire à PHP où se trouve votre CA Certificate
fichier pour le laisser vérifier correctement les certificats:
; modify the absolute path to the cacert.pem file
curl.cainfo=c:\php\cacert.pem
Les dernières cacert.pem
peuvent être téléchargées sur Internet ou extraites de votre navigateur préféré . Lorsque vous modifiez php.ini
des paramètres associés, n'oubliez pas de redémarrer votre serveur Web.
http_build_query()
pour gérer les paramètres; il suffit de passer le tableau àCURLOPT_POSTFIELDS
est suffisant.