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

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

Рассмотрим два файла сценариев: 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 ).

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

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

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

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

  • Как переключиться с POST на GET в PHP CURL

Для дальнейшего использования в документе 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».