CURLOPT_POST и CURLOPT_POSTFIELDS: требуется ли опция CURLOPT_POST?

Я новичок в cURL в PHP. У меня вопрос относительно использования параметров завитка.

Рассмотрим два файла script: test1.php и test2.php, которые присутствуют в корневом www. Я использую Ubuntu 12.04 LTS. Версия libcurl для PHP 7.22.0.

Содержание test1.php

<?php
    $ch = curl_init();
    $post_data = array(
        'firstname' => 'John',
        'lastname' => 'Doe'
    );
    curl_setopt($ch, CURLOPT_URL, 'localhost/test2.php');
    curl_setopt($ch, CURLOPT_POST, TRUE);   //is it optional?
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    curl_exec($ch);
    curl_close($ch);
?>

Содержимое test2.php

<?php 
    var_dump($_POST);
?>

Когда я выполняю test1.php через браузер, я вижу результаты, опубликованные. Теперь, если я удаляю параметр curl, содержащий CURLOPT_POST, пример все же работает. Даже если для параметра CURLOPT_POST установлено значение false, сообщение будет опубликовано и результат будет отображаться. Итак, что CURLOPT_POST не требуется вообще? Похоже, что опция CURLOPT_POSTFIELDS позаботится о передаче данных через POST без использования опции CURLOPT_POST. Когда я печатаю $_SERVER в test2.php, метод запроса всегда устанавливается на POST (с опцией CURLOPT_POST или без нее).

Может ли кто-нибудь, пожалуйста, сообщить мне точное использование опции CURLOPT_POST? Требуется ли для отправки данных через POST?

Ответы

Ответ 1

Вы правы. CURLOPT_POSTFIELDS подразумевает CURLOPT_POST. Вам не нужно использовать CURLOPT_POST при использовании CURLOPT_POSTFIELDS. В этом случае метод запроса всегда будет установлен в POST.

Обратите внимание, что это в вашем случае, если вы хотите, чтобы он был POST.

Если вы не хотите, чтобы это был запрос POST, но установите CURLOPT_POSTFIELDS, см. этот связанный Q & A:

Ответ 2

В будущем ссылка на документ API говорит об CURLOPT_POST


Резюме:

Истинный параметр сообщает библиотеке регулярно публиковать HTTP-сообщение. Это также позволит библиотеке использовать заголовок "Content-Type: application/x-www-form-urlencoded". (Это, безусловно, наиболее часто используемый метод POST).

Используйте параметр CURLOPT_POSTFIELDS, чтобы указать, какие данные следует отправлять, и CURLOPT_POSTFIELDSIZE, чтобы установить размер данных. При желании вы можете предоставить данные для POST с использованием параметров CURLOPT_READFUNCTION и CURLOPT_READDATA.

Вы можете переопределить заголовок POST Content-Type по умолчанию, установив свой собственный с помощью CURLOPT_HTTPHEADER.

Использование POST с HTTP 1.1 подразумевает использование заголовка "Ожидание: 100-продолжить". Вы можете отключить этот заголовок с помощью CURLOPT_HTTPHEADER, как обычно.

Если вы используете POST на сервер HTTP 1.1, вы можете отправлять данные, не зная размера, перед запуском POST, если вы используете кодировку с чередованием. Вы включаете это, добавляя заголовок, например "Transfer-Encoding: chunked" с CURLOPT_HTTPHEADER. С помощью HTTP 1.0 или без пакетной передачи вы должны указать размер в запросе.

если вы выдали запрос POST и хотите вместо этого использовать HEAD или GET, вы должны явно выбрать новый тип запроса, используя CURLOPT_NOBODY или CURLOPT_HTTPGET или аналогичный.


Я тестирую прямо сейчас, будет ли параметр CURLOPT_POST пытаться переопределить мой параметр CURLOPT_HTTPHEADER, "Content-Type: application/json; charset = utf-8".