Procedurale
// 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);
Orientato agli oggetti
<?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;
}
}
uso
// 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()));
}
Nota a margine qui: sarebbe meglio creare una sorta di interfaccia chiamata AdapterInterface
ad esempio con il getResponse()
metodo e lasciare che la classe sopra lo implementasse. Quindi puoi sempre scambiare questa implementazione con un altro adattatore di tuo gradimento, senza effetti collaterali per la tua applicazione.
Utilizzo del traffico HTTPS / crittografato
Di solito c'è un problema con cURL in PHP con il sistema operativo Windows. Durante il tentativo di connettersi a un endpoint protetto https, verrà visualizzato un errore certificate verify failed
.
Quello che la maggior parte delle persone fa qui è dire alla libreria cURL di ignorare semplicemente gli errori del certificato e continue ( curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
). Poiché questo farà funzionare il tuo codice, introduci un enorme buco nella sicurezza e consenti agli utenti malintenzionati di eseguire vari attacchi alla tua app come l' attacco Man In The Middle o simili.
Mai e poi mai. Invece, devi semplicemente modificare il tuo php.ini
e dire a PHP dove si trova il tuo CA Certificate
file per permettergli di verificare correttamente i certificati:
; modify the absolute path to the cacert.pem file
curl.cainfo=c:\php\cacert.pem
Le ultime cacert.pem
possono essere scaricate da Internet o estratte dal tuo browser preferito . Quando si cambia qualsiasiphp.ini
impostazioni correlate, ricordarsi di riavviare il server Web.
http_build_query()
per gestire i parametri; è sufficiente passare l'array aCURLOPT_POSTFIELDS
.