Процедурный
// 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()));
}
Примечание здесь: было бы лучше создать некоторый интерфейс с именем AdapterInterface
, например, с методом getResponse()
, и позволить классу выше реализовать его. Затем вы всегда можете поменять эту реализацию на другой понравившийся вам адаптер, без каких-либо побочных эффектов для вашего приложения.
Использование HTTPS / шифрование трафика
Обычно есть проблема с cURL в PHP под операционной системой Windows. При попытке подключиться к защищенной https конечной точке вы получите сообщение об ошибке certificate verify failed
.
Что большинство людей делают здесь, это говорят библиотеке cURL просто игнорировать ошибки сертификата и продолжать (curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
). Поскольку это заставит ваш код работать, вы создадите огромную дыру в безопасности и дадите злоумышленникам возможность выполнять различные атаки на ваше приложение, например Man In the Middle атака или тому подобное.
Никогда, никогда не делай этого. Вместо этого вам просто нужно изменить ваш php.ini
и сообщить PHP, где находится ваш файл CA Certificate
, чтобы он мог правильно проверять сертификаты:
; modify the absolute path to the cacert.pem file
curl.cainfo=c:\php\cacert.pem
Самую последнюю версию cacert.pem
можно загрузить из Интернета или , извлеченную из вашего любимого браузера . При изменении любых настроек, связанных с php.ini
, не забудьте перезапустить веб-сервер.