php curl curlopt postfields

curl POST формат для CURLOPT_POSTFIELDS

Когда я использую curl с помощью POST и установить CURLOPT_POSTFIELD Должен ли я urlencode или какой-то особый формат?

например: если я хочу опубликовать 2 поля, первое и последнее:

какой точный код / ​​формат должен использоваться с curl?

Решение

Кроме того, вам не нужно создавать дополнительные функции для построения запроса для ваших массивов, у вас уже есть это:

Другие решения

РЕДАКТИРОВАТЬ: От php5 и выше, использование http_build_query Рекомендовано:

Простой пример из руководства:

до php5:

Полные данные для публикации в HTTP-операции «POST». Чтобы опубликовать файл, добавьте @ к имени файла и используйте полный путь. Тип файла можно явно указать, следуя имени файла с типом в формате ‘; type = mimetype’. Этот параметр может быть передан как строка в кодировке urlen, например ‘para1 = val1&para2 = знач2&… ‘или в виде массива с именем поля в качестве ключа и данными поля в качестве значения. Если значение является массивом, заголовок Content-Type будет установлен в multipart / form-data. Начиная с PHP 5.2.0, файлы, которые передаются в эту опцию с префиксом @, должны работать в виде массива.

Поэтому что-то вроде этого должно работать идеально (с параметрами, передаваемыми в ассоциативном массиве):

Не передавайте строку вообще!

Вы можете передать массив и позволить php / curl делать грязную работу по кодированию и т. Д.

Еще одно важное отличие, которое здесь еще не упомянуто, заключается в том, что CURLOPT_POSTFIELDS не может обрабатывать вложенные массивы.

Если мы возьмем вложенный массив [‘a’ => 1, ‘b’ => [2, 3, 4]] тогда это должно быть параметризовано как a=1&b[]=2&b[]=3&b[]=4 ( [ а также ] будет / должен быть закодирован URL). Это будет автоматически преобразовано обратно во вложенный массив на другом конце (при условии, что здесь другой конец также PHP).

Это будет работать:

Это даст вам уведомление. Выполнение кода будет продолжено, и ваша конечная точка получит параметр b как строка «Array» :

Примечание PHP: преобразование массива в строку в … on line …

для вложенных массивов вы можете использовать:

За CURLOPT_POSTFIELDS параметры могут быть переданы в виде строки, кодированной как para1=val1&para2=val2&.. или в виде массива с именем поля в качестве ключа и данными поля в качестве значения

Попробуйте следующий формат:

Интересно кстати Почтальон делает POST полной операцией GET с этими 2 дополнительными опциями:

Просто по-другому, и это работает очень хорошо.

Источник

cURL в PHP: примеры POST, GET запросов с headers, cookie, JSON и многопоточностью

В этой статье мы рассмотрим эффективные приемы работы с cURL, отправление POST, GET и т.д. запросов, работу с cookie, заголовки, JSON а также в конце статьи будут некоторые полезные инструменты, которые могут значительно облегчить вам работу с HTTP запросами.

GET запрос при помощи cURL

Для того, чтобы отправить запрос, нужно создать объект при помощи функции curl_init(), а затем следует настроить его.

Все настройки, которые вы можете найти по этой ссылке. Там вы найдете опции, которые мы будем устанавливать функцией curl_setopt, в дальнейших примерах.

Пример простого GET запроса при помощи cURL:

Если в результате сервер вернет нам редирект, то мы по нему автоматически не перейдем. А иногда это бывает полезно. Чтобы cURL автоматически шел по редиректу нужно установить опцию CURLOPT_FOLLOWLOCATION.

С установленной опцией скрипт автоматически перейдет по вернувшемуся редиректу и вернет ответ уже с итоговой страницы.

POST запрос при помощи cURL

Теперь давайте отправим post запрос на адрес https://httpbin.org/anything

Отлично, с GET и POST запросами в cURL мы немного освоились. Теперь разберемся с заголовками, которые мы можем отсылать в запросе.

Заголовки устанавливаются при помощи опции CURLOPT_HTTPHEADER Чтобы получше узнать, для чего нужна эта опция давайте попробуем отправить POST запрос в формате JSON

cURL: POST запрос в формате JSON

Отличия конфигурации JSON запроса от обычного POST запроса заключается в том, что мы кодируем поля при помощи json_encode() И добавляем заголовок Content-Type: application/json

cURL: GET запрос в формате JSON

GET запрос в формате JSON отправляется так же как и POST запрос, просто нужно CURLOPT_CUSTOMREQUEST установить в ‘GET’

cURL и другие виды HTTP запросов: PUT, DELETE, HEAD, PATCH, OPTIONS, CONNECT и т.д.

Стоп, Дмитрий, прекрати выдумывать виды запросов!

Ничего я не выдумываю: HTTP протокол предполагает множество типов HTTP запросов просто POST и GET являются более распространенными.

Чтобы отправить PUT запрос, нужно установить опцию CURLOPT_PUT таким образом:

Это делается по тому же принципу, как и CURLOPT_POST. Но что делать с остальным зоопарком запросов? Разве у cURL есть CURLOPT_DELETE или CURLOPT_HEAD? Нет.

Для того, чтобы отправлять другие виды запросов есть другая опция: CURLOPT_CUSTOMREQUEST

Вместо строки curl_setopt($curl, CURLOPT_POST, true); мы явно задаем имя запроса опцией CURLOPT_CUSTOMREQUEST:

Замечание: Не используйте эту возможность пока не убедитесь, что сервер поддерживает данный тип запроса.

Как получить заголовки ответа

В предыдущем примере мы научились посылать заголовки. Самый правильный способ принять заголовки:

Иногда можно встретить другой вариант получения заголовков ответа. К сожалению, они не совсем правильные и могут работать некорректно в некоторых случаях.

Рассмотрим такой пример:

Мы сначала определяем размер заголовка, с помощью CURLINFO_HEADER_SIZE затем вырезаем его из ответа. К сожалению, это может не срабатывать, когда используется прокси или в некоторых случаях редиректа.

Скачивание больших файлов с помощью cURL

Для того, чтобы скачать большой файл пригодится этот способ:

Обратите внимание, если вы будете использовать file_get_contents для скачивания файлов, то файл сначала загружается в оперативную память, а потом сохраняется на диск. Поэтому если файл действительно большой, то скорее всего вашему серверу не хватит памяти. Также к памяти будет требователен следующий код:

Здесь мы скачиваем файл при помощи cURL в оперативную память, а затем сохраняем его на диск. Не смотря на то, что этот способ не годится для скачивания больших файлов, с помощью него можно вполне сохранить простую веб страницу.

Параллельные cURL запросы в PHP

Для чего могут потребоваться многопоточные запросы? Например у нас есть много URL адресов:

И если мы будем по очереди отправлять запросы, то второй запрос начнется только после того, как закончился первый и так далее, а это существенно увеличивает время работы скрипта.

Как выполнить 3 запроса одновременно? В этом нам поможет curl_multi_

Давайте решим конкретную задачу при помощи параллельных curl запросов. Нам нужно отправить одновременно 3 запроса.

Такие параллельные запросы выполняются значительно быстрее чем поочередные.

cURL запросы с сохранением и загрузкой cookie из файла

cURL позволяет нам установить cookie при передачи запросов, а также автоматически принимать и устанавливать cookie, которые нам возвращает сервер, сохраняя их между запросами.

Давайте рассмотрим такой пример:

Теперь cookie у нас хранятся в файле cookie.txt в директории со скриптом (если вы ничего не меняли). Если мы совершаем повторные запросы, то cURL автоматически берет и отправляет cookie на сервер, как и обычный браузер. Таким образом мы можем авторизироваться на сайте и сохранить сеанс между запросами.

Передача cookie без файлов

Иммитация браузера с помощью cURL

Иногда сайт, к которому мы обращаемся может фильтровать запросы, защищаясь от парсинга. Если для этого используются упрощенные способы защиты, например проверка User-Agent, то мы можем легко притвориться, что являемся реальным польователем, который взаимодействует с сайтом через браузер, мы можем послать заголовки и cookie, которые обычно посылает браузер.

В данном примере установлены заголовки, которые посылает Chrome.

В простых ситуациях этого хватает. Но если используется защита при помощи javascript или что-то более продвинутое, то здесь cURL бессилен, и следует использовать либо BAS либо Zennoposter. Либо если вы хотите попытать счастье с PHP, то Selenium.

Не используйте эти знания в противоправных целях.

cURL запросы через прокси

Простой пример для отправки запросов через proxy. Если ваш прокси предполагает авторизацию, то раскомментируйте соответствующие строчки.

Отправка файлов

Авторизация с помощью cURL

HTTP Авторизация

Чтобы с помощью cURL авторизироваться на сайте, который использует Basic HTTP-аутентификацию нужно установить опцию CURLOPT_USERPWD, в которой будет наш логин и пароль.

OAuth авторизация

Авторизация через форму

Давайте применим полученные нами знания и авторизируемся на каком-нибудь сайте. Для этого нужно посмотреть куда форма отправляет данные и отправить туда то же самое.

Допустим на сайте есть такая форма:

Тогда наш cURL запрос должен быть сформирован так:

Автоматическое построение запросов

Перевод консольной команды curl в PHP

И вот еще один сервис, который переводит консольную команду curl в PHP: https://incarnate.github.io/curl-to-php/

Так вы можете создать простые запросы на cURL в PHP не создавая их вручную.

Лайфхак

В консоли браузера, во вкладке сеть, вы можете кликнуть правой кнопкой мыши и скопировать любой запрос в виде команды cURL, а потом с помощью сервиса curl-to-php перевести запрос в PHP. Теперь вы вообще можете сконвертировать в cURL абсолютно любой запрос, который посылает ваш браузер.

Как работать с cURL гораздо проще

Вы можете спросить: почему у cURL такие кривые и страшные методы? У вас может возникнуть желание взять и создать обертку для работы с cURL, чтобы вы могли не писать каждый раз большие куски некрасивого кода, а писать все проще, например так:

К счастью, такая обертка уже написана и найти ее можно здесь: https://github.com/php-curl-class/php-curl-class

Просто установите ее при помощи: composer require php-curl-class/php-curl-class и не работайте с кривыми кусками кода, которые таковы вероятно потому, что cURL изначально консольное приложение.

POST и GET запросы без cURL

С помощью PHP мы можем отправить простой GET запрос используя функцию file_get_contents.

При помощи file_get_contents мы также можем отправить POST запрос.

Подробнее о том, какие опции можно передавать в stream_context_create, вы можете изучить здесь: http://docs.php.net/manual/ru/context.http.php

Другие инструменты для работы с запросами в PHP

Для работы с запросами есть еще более мощный инструмент: Guzzle

Несколько примеров на Guzzle

GET запросы на Guzzle

Разные типы запросов на Guzzle

Асинхронные запросы на Guzzle

Если интересно, то читайте: Guzzle Quick Start

Пишите комментарии, если что-то осталось не понятно.

Источник

CURLOPT_POST vs. CURLOPT_POSTFIELDS: Is CURLOPT_POST option required?

I’m new to cURL in PHP. I have a question regarding usage of curl options.

Consider two script files: test1.php and test2.php both present in root www. I’m using Ubuntu 12.04 LTS. The libcurl version for PHP is 7.22.0.

Contents of test1.php

Contents of test2.php

php curl curlopt postfields. Смотреть фото php curl curlopt postfields. Смотреть картинку php curl curlopt postfields. Картинка про php curl curlopt postfields. Фото php curl curlopt postfields

2 Answers 2

You are correct. CURLOPT_POSTFIELDS implies CURLOPT_POST. You don’t need to use CURLOPT_POST while using CURLOPT_POSTFIELDS. The request method will always be set to POST in this case.

Note that this is in your case as long as you want it to be a POST request.

If you don’t want to be it a POST request but set CURLOPT_POSTFIELDS, please see this related Q&A:

For future reference the API document say this about CURLOPT_POST

Summary:

A true parameter tells the library to do a regular HTTP post. This will also make the library use the a «Content-Type: application/x-www-form-urlencoded» header. (This is by far the most commonly used POST method).

Use the CURLOPT_POSTFIELDS option to specify what data to post and CURLOPT_POSTFIELDSIZE to set the data size. Optionally, you can provide data to POST using the CURLOPT_READFUNCTION and CURLOPT_READDATA options.

You can override the default POST Content-Type: header by setting your own with CURLOPT_HTTPHEADER.

Using POST with HTTP 1.1 implies the use of a «Expect: 100-continue» header. You can disable this header with CURLOPT_HTTPHEADER as usual.

If you use POST to a HTTP 1.1 server, you can send data without knowing the size before starting the POST if you use chunked encoding. You enable this by adding a header like «Transfer-Encoding: chunked» with CURLOPT_HTTPHEADER. With HTTP 1.0 or without chunked transfer, you must specify the size in the request.

if you have issued a POST request and want to make a HEAD or GET instead, you must explicitly pick the new request type using CURLOPT_NOBODY or CURLOPT_HTTPGET or similar.

I’m testing right now whether setting the CURLOPT_POST to try will override my CURLOPT_HTTPHEADER, «Content-Type: application/json; charset=utf-8» setting.

Источник

(PHP 4 >= 4.0.2, PHP 5, PHP 7)

curl_setopt — Устанавливает параметр для сеанса CURL

Описание

Устанавливает параметр для указанного сеанса cURL.

Список параметров

Устанавливаемый параметр CURLOPT_XXX.

/.netrc на предмет логина и пароля для удаленного сайта, с которым устанавливается соединение. CURLOPT_NOBODY TRUE для исключения тела ответа из вывода. Метод запроса устанавливается в HEAD. Смена этого параметра в FALSE не меняет его обратно в GET. CURLOPT_NOPROGRESS

TRUE для отмены индикатора прогресса при передачах cURL.

Эта опция устарела, так как никогда не была реализована в cURL и не работала.

Удалена в PHP 5.6.0. CURLOPT_CONNECTTIMEOUTКоличество секунд ожидания при попытке соединения. Используйте 0 для бесконечного ожидания. CURLOPT_CONNECTTIMEOUT_MSКоличество миллисекунд ожидания при попытке соединения. Используйте 0 для бесконечного ожидания. Если библиотека libcurl скомпилирована с использованием стандартного системного преобразователя имен, то соединение будет по-прежнему использовать полносекундное ожидание в качестве тайм-аута с минимально допустимым тайм-аутом в 1 секунду.Добавлен в версии cURL 7.16.2. Доступно, начиная с версии PHP 5.2.3. CURLOPT_DNS_CACHE_TIMEOUTКоличество секунд, в течение которых в памяти хранятся DNS-записи. По умолчанию этот параметр равен 120 (2 минуты). CURLOPT_FTPSSLAUTHМетод FTP аутентификации (в активном режиме): CURLFTPAUTH_SSL (сначала проверяется SSL), CURLFTPAUTH_TLS (сначала проверяется TLS) или CURLFTPAUTH_DEFAULT (cURL решает сама).Добавлен в версии cURL 7.12.2. CURLOPT_HTTP_VERSIONCURL_HTTP_VERSION_NONE (по умолчанию, CURL сама выбирает используемую версию), CURL_HTTP_VERSION_1_0 (принудительное использование HTTP/1.0), or CURL_HTTP_VERSION_1_1 (принудительное использование HTTP/1.1). CURLOPT_HTTPAUTH

Можно использовать побитовый оператор | (или) для комбинации нескольких методов вместе. В этом случае cURL опросит сервер на предмет поддерживаемых методов авторизации и выберет лучший из них.

Рекомендуется не устанавливать эту опцию и оставить значение по умолчанию. Установка в 2 или 3 опасно и допускает применение известных уязвимостей в SSLv2 и SSLv3.

Собственный метод запроса, используемый вместо «GET» или «HEAD» при выполнении HTTP-запроса. Это полезно при запросах «DELETE» или других, более редких HTTP-запросах. Корректными значениями будут слова наподобие «GET», «POST», «CONNECT» и так далее; т.е. не вводите здесь всю строку с HTTP-запросом. Например, указание «GET /index.html HTTP/1.0\r\n\r\n» будет неправильным.

Не используйте эту возможность пока не убедитесь, что сервер поддерживает данный тип запроса.

Так как этот параметр содержит ценный пароль, помните, что данный PHP-скрипт нужно хранить в безопасном месте.

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Список изменений

Примеры

Пример #1 Инициализация сеанса CURL и загрузка web-страницы

// создание нового ресурса cURL
$ch = curl_init ();

Пример #2 Закачка файла

Результат выполнения данного примера:

Примечания

Передача массива в CURLOPT_POSTFIELDS закодирует данные в виде multipart/form-data, тогда как передача URL-кодированной строки закодирует данные в виде application/x-www-form-urlencoded.

Смотрите также

Источник

Php curl curlopt postfields

PHP поддерживает libcurl, библиотеку, созданную Daniel»ом Stenberg»ом, которая даёт возможность соединяться с серверами различных типов и по разным протоколам.
libcurl в настоящее время поддерживает протоколы http, https, ftp, gopher, telnet, dict, file и ldap.
libcurl также поддерживает сертификаты HTTPS, HTTP POST, HTTP PUT, загрузку по FTP (это можно сделать также РНР-расширением ftp), загрузку на основе форм HTTP, прокси, куки и аутентификацию user+password.

Эти функции были введены в PHP 4.0.2.

curl_init

Описание

resource curl_init([string url])

Функция curl_init() инициализирует новую сессию и возвратит CURL-дескриптор для использования в функциях curl_setopt(), curl_exec() и curl_close(). Если необязательный параметр url предоставлен, то опция CURLOPT_URL получит значение этого параметра. Вы можете вручную устанавливать его с помощью функции curl_setopt().

curl_setopt

Описание

bool curl_setopt (resource ch, string option, mixed value)

Функция curl_setopt() устанавливает опции для CURL-сессии, идентифицируемой параметром ch. Параметр option является опцией, которую вы хотите установить, а value это значение опции option.

Параметр value должен быть long для следующих опций (специфицированных параметром option):

Параметр value должен быть строкой для следующих значений параметра option:

Следующие опции ожидают дескриптора файла, который получается с помощью функции fopen():

Параметр value должен быть функцией следующего вида long write_callback (resource ch, string data) для следующих значений параметра option:

Параметр value должен быть функцией следующего вида string read_callback (resource ch, resource fd, long length)<> для следующих значений параметра option:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *