Web

PHP + curl, пример кода HTTP POST

Может ли кто-нибудь показать мне, как сделать 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

Как выполнить запрос «INSERT IF NOT EXIST» в MySQL?

Web

Отладка проблем с функцией exec

Web

PHP – статические свойства

Web

Создание переменной сессии из параметра столбца mysql