Может ли кто-нибудь показать мне, как сделать php curl с помощью HTTP POST?
Я хочу отправить такие данные:
username=user1, password=passuser1, gender=1
на www.domain.com
Я ожидаю, что curl вернет ответ вроде result=OK. Есть примеры?
Ответ 1
<?php
//
// Очень простой PHP пример отправки HTTP POST на удаленный сайт
//
$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");
// В реальной жизни вы должны использовать что-то вроде:
// curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('postvar1' => 'value1')));
// Получение ответа сервера ...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec($ch);
curl_close ($ch);
// Дальнейшая обработка ...
if ($server_output == "OK") { ... } else { ... }
?>
Ответ 2
Процедурный подход:
// установка полей post
$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);
// выпонение!
$response = curl_exec($ch);
// закрыть соединение, освободить используемые ресурсы
curl_close($ch);
// дальнейшая обработка
var_dump($response);
Подход объектно-ориентированный:
<?php
namespace MyApp\Http;
class CurlPost {
private $url;
private $options;
public function __construct($url, array $options = []) {
$this->url = $url;
$this->options = $options;
}
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;
}
}
Применение
// создание объекта curl
$curl = new \MyApp\Http\CurlPost('http://www.example.com');
try {
// выполнение запроса
echo $curl([
'username' => 'user1',
'password' => 'passuser1',
'gender' => 1,
]);
} catch (\RuntimeException $ex) {
// перехват ошибок
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 файл, чтобы он мог правильно проверять сертификаты:
; абсолютный путь к файлу сертификата cacert.pem
curl.cainfo=c:\php\cacert.pem
Последнюю cacert.pem версию можно загрузить из интернета или извлечь из браузера. При изменении любых php.ini связанных настроек не забудьте перезапустить ваш веб-сервер.
Ответ 3
Живой пример использования php curl_exec для создания HTTP-сообщения:
Поместите это в файл с именем foobar.php:
<?php
$ch = curl_init();
$skipper = "Какой-то поисковый запрос..";
$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);
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;
curl_close ($ch);
?>
Затем запустите его с помощью команды php foobar.php, скрипт выведет на экран следующее:
<!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>
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<body>
Некоторое содержимое...
</body>
</html>
Вы сделали PHP POST на www.google.com и отправили ему некоторые данные.
Web