2014-11-04 1 views
14

Я новичок в cURL в PHP. У меня вопрос относительно использования параметров завитка.CURLOPT_POST vs. CURLOPT_POSTFIELDS: требуется ли опция CURLOPT_POST?

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

+2

Да. Чтобы установить метод запроса «post» в curl, мы устанавливаем curl_setopt ($ ch, CURLOPT_POST, TRUE); и для передачи данных мы используем ассоциативный массив. И если массив мультииндикален, мы используем json_encode для внутреннего уровня. –

+2

Вы правильно прочитали вопрос? Я не спрашиваю, что делают эти опции CURLOPT_POSTFIELDS и CURLOPT_POST. Вы пробовали примеры, о которых я упомянул? –

ответ

17

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

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

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

0

Для дальнейшего использования документ 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 и хотите сделать ГОЛОВА или GET вместо этого, вы должны явно выбрать новый тип запроса с использованием CURLOPT_NOBODY или CURLOPT_HTTPGET или аналогичным.


Я тестирую прямо сейчас ли установка CURLOPT_POST попробовать перекроет мой CURLOPT_HTTPHEADER, "Content-Type: применение/JSon; кодировка = UTF-8" настройки.