PHP + curl, HTTP POST пример кода? - PullRequest
425 голосов
/ 26 января 2010

Может кто-нибудь показать мне, как сделать php curl с HTTP POST?

Я хочу отправить данные следующим образом:

username=user1, password=passuser1, gender=1

К www.domain.com

Я ожидаю, что локон вернет ответ, подобный result=OK. Есть ли примеры?

Ответы [ 11 ]

726 голосов
/ 26 января 2010
<?php
//
// A very simple PHP example that sends a HTTP POST to a remote site
//

$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");

// In real life you should use something like:
// curl_setopt($ch, CURLOPT_POSTFIELDS, 
//          http_build_query(array('postvar1' => 'value1')));

// Receive server response ...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$server_output = curl_exec($ch);

curl_close ($ch);

// Further processing ...
if ($server_output == "OK") { ... } else { ... }
?>
220 голосов
/ 20 августа 2015

Процедурный

// 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, не забудьте перезапустить веб-сервер.

27 голосов
/ 15 января 2014

Пример использования php curl_exec для создания HTTP-сообщения:

Поместите это в файл с именем foobar.php:

<?php
  $ch = curl_init();
  $skipper = "luxury assault recreational vehicle";
  $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);                //0 for a get request
  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 is:" . $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</title>

<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<body>
  A mountain of content...
</body>
</html>

Итак, вы сделали PHP POST на www.google.com и отправили ему некоторые данные.

Если бы сервер был запрограммирован для чтения переменных post, он мог бы решить сделать что-то другое на основании этого.

21 голосов
/ 16 июня 2015

Это может быть легко достигнуто с помощью:

<?php

$post = [
    'username' => 'user1',
    'password' => 'passuser1',
    'gender'   => 1,
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.domain.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
$response = curl_exec($ch);
var_export($response);
9 голосов
/ 28 апреля 2017

Сообщение Curl + Обработка ошибок + Установка заголовков [спасибо @ mantas-d]:

function curlPost($url, $data=NULL, $headers = NULL) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    if(!empty($data)){
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }

    if (!empty($headers)) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    }

    $response = curl_exec($ch);

    if (curl_error($ch)) {
        trigger_error('Curl Error:' . curl_error($ch));
    }

    curl_close($ch);
    return $response;
}


curlPost('google.com', [
    'username' => 'admin',
    'password' => '12345',
]);
6 голосов
/ 13 апреля 2016
curlPost('google.com', [
    'username' => 'admin',
    'password' => '12345',
]);


function curlPost($url, $data) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $response = curl_exec($ch);
    $error = curl_error($ch);
    curl_close($ch);
    if ($error !== '') {
        throw new \Exception($error);
    }

    return $response;
}
6 голосов
/ 26 января 2010

Если форма использует перенаправления, аутентификацию, куки, SSL (https) или что-то еще, кроме полностью открытого скрипта, ожидающего переменные POST, вы начнете очень быстро скрежетать зубами. Взгляните на Snoopy , который делает именно то, что вы имеете в виду, устраняя необходимость в настройке больших накладных расходов.

3 голосов
/ 10 октября 2013

Вот несколько шаблонных кодов для PHP + curl http://www.webbotsspidersscreenscrapers.com/DSP_download.php

включение в эти библиотеки упростит разработку

<?php
# Initialization
include("LIB_http.php");
include("LIB_parse.php");
$product_array=array();
$product_count=0;

# Download the target (store) web page
$target = "http://www.tellmewhenitchanges.com/buyair";
$web_page = http_get($target, "");
    ...
?>
3 голосов
/ 28 июня 2013

Более простой ответ, если вы передаете информацию на свой сайт, - это использовать переменную SESSION. Начните php страницу с:

session_start();

Если в какой-то момент есть информация, которую вы хотите сгенерировать в PHP и перейти на следующую страницу сеанса, вместо использования переменной POST, присвойте ее переменной SESSION. Пример:

$_SESSION['message']='www.'.$_GET['school'].'.edu was not found.  Please try again.'

Затем на следующей странице вы просто ссылаетесь на эту переменную SESSION. ПРИМЕЧАНИЕ: после использования убедитесь, что вы уничтожили его, чтобы он не сохранялся после его использования:

if (isset($_SESSION['message'])) {echo $_SESSION['message']; unset($_SESSION['message']);}
2 голосов
/ 17 января 2018

Если вы пытаетесь зайти на сайт с помощью куки.

Этот код:

if ($server_output == "OK") { ... } else { ... }

Может не работать, если вы попытаетесь войти в систему, потому что многие сайты возвращают статус 200, но сообщение не успешно.

Простой способ проверить, успешна ли запись для входа в систему, - проверить, не устанавливает ли она снова куки. Если в выводе есть строка Set-Cookies, это означает, что сообщения не успешны, и начинается новый сеанс.

Также сообщение может быть успешным, но статус может быть перенаправлен вместо 200.

Чтобы убедиться, что сообщение успешно, попробуйте это:

Следуйте по местоположению после сообщения, поэтому оно перейдет на страницу, на которую сообщение будет перенаправлено:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

А затем проверьте, существуют ли в запросе новые файлы cookie:

if (!preg_match('/^Set-Cookie:\s*([^;]*)/mi', $server_output)) 

{echo 'post successful'; }

else { echo 'not successful'; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...