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".