Передача значений $ _POST с помощью cURL

95

Как передать $_POSTзначения на страницу с помощью cURL?

Скотт Готтреу
источник

Ответы:

168

Должно работать нормально.

$data = array('name' => 'Ross', 'php_master' => true);

// You can POST a file by prefixing with an @ (for <input type="file"> fields)
$data['file'] = '@/home/user/world.jpg';

$handle = curl_init($url);
curl_setopt($handle, CURLOPT_POST, true);
curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
curl_exec($handle);
curl_close($handle)

У нас есть два варианта, CURLOPT_POSTкоторые включают HTTP POST и CURLOPT_POSTFIELDSсодержат массив наших данных для отправки. Это можно использовать для отправки данных в POST <form>s.


Важно отметить, что curl_setopt($handle, CURLOPT_POSTFIELDS, $data);$ data принимает два формата, и это определяет, как будут кодироваться данные публикации.

  1. $dataкак array(): данные будут отправлены в том виде, в multipart/form-dataкотором они не всегда принимаются сервером.

    $data = array('name' => 'Ross', 'php_master' => true);
    curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
  2. $dataкак строка с кодировкой url: данные будут отправлены как application/x-www-form-urlencoded, что является кодировкой по умолчанию для отправленных данных HTML-формы.

    $data = array('name' => 'Ross', 'php_master' => true);
    curl_setopt($handle, CURLOPT_POSTFIELDS, http_build_query($data));

Надеюсь, это поможет другим сэкономить время.

Видеть:

Росс
источник
Ваша заметка сэкономила мне как минимум час отладки. Спасибо.
Вивек Кумар,
30

У Росс есть правильная идея для POST-отправки обычного формата параметра / значения в URL-адрес.

Недавно я столкнулся с ситуацией, когда мне нужно было отправить XML как Content-Type «text / xml» без каких-либо пар параметров, поэтому вот как это сделать:

$xml = '<?xml version="1.0"?><stuff><child>foo</child><child>bar</child></stuff>';
$httpRequest = curl_init();

curl_setopt($httpRequest, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($httpRequest, CURLOPT_HTTPHEADER, array("Content-Type:  text/xml"));
curl_setopt($httpRequest, CURLOPT_POST, 1);
curl_setopt($httpRequest, CURLOPT_HEADER, 1);

curl_setopt($httpRequest, CURLOPT_URL, $url);
curl_setopt($httpRequest, CURLOPT_POSTFIELDS, $xml);

$returnHeader = curl_exec($httpRequest);
curl_close($httpRequest);

В моем случае мне нужно было проанализировать некоторые значения из заголовка ответа HTTP, поэтому вам не обязательно нужно устанавливать CURLOPT_RETURNTRANSFERили CURLOPT_HEADER.

Марк Бик
источник
1
Плакат просит не об этом, но это именно то, что я искал, спасибо!
davr
Я рад, что кто-то нашел это полезным.
Марк Бик,
1
ваш "curl_setopt ($ httpRequest, CURLOPT_HTTPHEADER, array (" Content-Type: text / xml "));" решил кое-что, на что у меня ушло уже пару часов! большое спасибо :)
Алексей Теницкий 01
Привет, Марк, если у тебя есть время, не могли бы вы помочь мне? .. Пожалуйста. нажмите здесь
jayAnn
Провели наши попытки выяснить, почему мои данные xml не были приняты при отправке с кодировкой urlencoded. Меня спасли Content-Type и отсутствие urlencode. Спасибо.
Самуэль
3
$query_string = "";

if ($_POST) {
    $kv = array();
    foreach ($_POST as $key => $value) {
        $kv[] = stripslashes($key) . "=" . stripslashes($value);
    }
    $query_string = join("&", $kv);
}

if (!function_exists('curl_init')){
    die('Sorry cURL is not installed!');
}

$url = 'https://www.abcd.com/servlet/';

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, count($kv));
curl_setopt($ch, CURLOPT_POSTFIELDS, $query_string);

curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, FALSE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);

$result = curl_exec($ch);

curl_close($ch);
Сапнанду
источник
3

Еще один простой PHP-пример использования cURL:

<?php
    $ch = curl_init();                    // Initiate cURL
    $url = "http://www.somesite.com/curl_example.php"; // Where you want to post data
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_POST, true);  // Tell cURL you want to post something
    curl_setopt($ch, CURLOPT_POSTFIELDS, "var1=value1&var2=value2&var_n=value_n"); // Define what you want to post
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Return the output in string format
    $output = curl_exec ($ch); // Execute

    curl_close ($ch); // Close cURL handle

    var_dump($output); // Show output
?>

Пример найден здесь: http://devzone.co.in/post-data-using-curl-in-php-a-simple-example/

Вместо использования curl_setoptвы можете использовать curl_setopt_array.

http://php.net/manual/en/function.curl-setopt-array.php

Юлиан
источник
Спасибо!! - Ваш код curl_setopt($ch, CURLOPT_POSTFIELDS, "var1=value1&var2=value2&var_n=value_n"); // Define what you want to postпредоставил мне то, что я искал :)
asugrue15
1
$url='Your url'; // Specify your url
$data= array('parameterkey1'=>value,'parameterkey2'=>value); // Add parameters in key value
$ch = curl_init(); // Initialize cURL
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
curl_close($ch);
Аникет Б
источник
1
Не могли бы вы расширить этот ответ? Несколько строк кода не дают ответа.
Рич Беннер
1) Укажите свой url 2) Создайте массив параметров 3) Инициализируйте завиток 4) установите Обязательные параметры завитка 5) Выполните Curl 6) Закройте Curl
Aniket B
0
<?php
    function executeCurl($arrOptions) {

        $mixCH = curl_init();

        foreach ($arrOptions as $strCurlOpt => $mixCurlOptValue) {
            curl_setopt($mixCH, $strCurlOpt, $mixCurlOptValue);
        }

        $mixResponse = curl_exec($mixCH);
        curl_close($mixCH);
        return $mixResponse;
    }

    // If any HTTP authentication is needed.
    $username = 'http-auth-username';
    $password = 'http-auth-password';

    $requestType = 'POST'; // This can be PUT or POST

    // This is a sample array. You can use $arrPostData = $_POST
    $arrPostData = array(
        'key1'  => 'value-1-for-k1y-1',
        'key2'  => 'value-2-for-key-2',
        'key3'  => array(
                'key31'   => 'value-for-key-3-1',
                'key32'   => array(
                    'key321' => 'value-for-key321'
                )
        ),
        'key4'  => array(
            'key'   => 'value'
        )
    );

    // You can set your post data
    $postData = http_build_query($arrPostData); // Raw PHP array

    $postData = json_encode($arrPostData); // Only USE this when request JSON data.

    $mixResponse = executeCurl(array(
        CURLOPT_URL => 'http://whatever-your-request-url.com/xyz/yii',
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPGET => true,
        CURLOPT_VERBOSE => true,
        CURLOPT_AUTOREFERER => true,
        CURLOPT_CUSTOMREQUEST => $requestType,
        CURLOPT_POSTFIELDS  => $postData,
        CURLOPT_HTTPHEADER  => array(
            "X-HTTP-Method-Override: " . $requestType,
            'Content-Type: application/json', // Only USE this when requesting JSON data
        ),

        // If HTTP authentication is required, use the below lines.
        CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
        CURLOPT_USERPWD  => $username. ':' . $password
    ));

    // $mixResponse contains your server response.
Мохаммад Фейсал Ислам
источник