Запросы curl в php на примерах

PROTOCOLS

curl supports numerous protocols, or put in URL terms: schemes. Your particular build may not support them all.

DICT

Lets you lookup words using online dictionaries.

FILE

Read or write local files. curl does not support accessing file:// URL remotely, but when running on Microsoft Windows using the native UNC approach will work.

FTP(S)

curl supports the File Transfer Protocol with a lot of tweaks and levers. With or without using TLS.

GOPHER

Retrieve files.

HTTP(S)

curl supports HTTP with numerous options and variations. It can speak HTTP version 0.9, 1.0, 1.1, 2 and 3 depending on build options and the correct command line options.

IMAP(S)

LDAP(S)

curl can do directory lookups for you, with or without TLS.

MQTT

curl supports MQTT version 3. Downloading over MQTT equals «subscribe» to a topic while uploading/posting equals «publish» on a topic. MQTT support is experimental and TLS based MQTT is not supported (yet).

POP3(S)

Downloading from a pop3 server means getting a mail. With or without using TLS.

RTMP(S)

The Realtime Messaging Protocol is primarily used to server streaming media and curl can download it.

RTSP

curl supports RTSP 1.0 downloads.

SCP

curl supports SSH version 2 scp transfers.

SFTP

curl supports SFTP (draft 5) done over SSH version 2.

SMB(S)

curl supports SMB version 1 for upload and download.

SMTP(S)

TELNET

Telling curl to fetch a telnet URL starts an interactive session where it sends what it reads on stdin and outputs what the server sends it.

TFTP

curl can do TFTP downloads and uploads.

PHP cURL POST

Разница между  и  запросами — это синтаксиc для отправки. Для  можно указать больше параметров, например, поля, которые будут отправляться. Допустим, вы хотите отправить форму на сайте куда делаете запрос, тогда в данном случае вам точно понадобиться .

// Для начала скажем, что мы хотим использовать cURL
$curl = curl_init();
// Определение прааметров. Ссылку (куда будет делаться запрос), какие заголовки будут у этого запроса, задаем, что запрос должен быть в формате POST и передаем параметры этого запроса в виде массива 'ключ' => 'значение'. 
curl_setopt_array($curl, [
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => 'http://testcURL.com',
    CURLOPT_USERAGENT => 'Codular Sample cURL Request',
    CURLOPT_POST => 1,
    CURLOPT_POSTFIELDS => 
]);
// Отправляем запроса и сохраняем его в $res
$res = curl_exec($curl);
// Закрываем запрос и удаляем инициализацию $curl
curl_close($curl);

Процедура отправки этого запроса почти идентична тому, что было в  за исключением двух дополнительных строчек. С помощью  мы говорим cURL о том, что хотим отправить  запрос и затем прописываем параметры для отправки с  в виде массива (сначала имя параметра и затем его значение).

CURLOPT_POSTFIELDS => 

Обратите внимание на то, что если на форме будет стоять капча (проверка на ботов), тогда зарегистрироваться автоматически не получится

PROGRESS METER

curl normally displays a progress meter during operations, indicating the amount of transferred data, transfer speeds and estimated time left, etc. The progress meter displays number of bytes and the speeds are in bytes per second. The suffixes (k, M, G, T, P) are 1024 based. For example 1k is 1024 bytes. 1M is 1048576 bytes.

curl displays this data to the terminal by default, so if you invoke curl to do an operation and it is about to write data to the terminal, it disables the progress meter as otherwise it would mess up the output mixing progress meter and response data.

If you want a progress meter for HTTP POST or PUT requests, you need to redirect the response output to a file, using shell redirect (>), or similar.

It is not the same case for FTP upload as that operation does not spit out any response data to the terminal.

If you prefer a progress «bar» instead of the regular meter, -#, —progress-bar is your friend. You can also disable the progress meter completely with the option.

curl examples

The following commands can all be entered directly into your terminal to retrieve a response.

1. HTTP request

The first example is the most basic example which demonstrates a simple curl command that simulates a request for a website URL. This command will output the HTTP response of the URL in question.

3. Saving the result of a curl command

The and curl options are used to save the result of the curl command. The difference between both options is that will save the file with a predefined filename, which in this case is . On the other hand, the option will save the file as its exisiting name, which is . An example of each scenario is shown below.

4. Adding an additional HTTP request header

This curl command has the ability to add an additional HTTP request header to your requests. Simply use the option and set the header name and value in enclosed quotes. If you do not define a value for the header then the header itself must be followed by a semicolon (e.g. ).

5. Generating additional information

The option (for verbose) can be defined within a curl command so that it will generate more information during the operation. For example, using the additional header example from above, we can add the option which will display more information in regards to the connection and will display the custom header as well as regular headers.

6. Resuming a download

If a download is started for a particular asset but gets interrupted or purposely stopped, it can easily be resumed with the option. Simply add to the curl command in question and the asset will resume downloading where it left off.

7. Storing HTTP headers

With the option, you have the ability to store the HTTP headers that a site sends back. This is useful for instance if you want to read the cookies from the headers by using a second curl command and including the option. The after the tells curl that the output file is stdout (the file into which kernel writes its output).

8. Testing the download time of an asset without any output

The following command uses a couple of curl options to achieve the desired result. The tells curl to store and display the headers in stdout and the option tells curl to download the defined resource. However, if you do not want any output, simply add to the end of the command. This example can be useful if you are testing the download speed of an asset but don’t want to print or save the output.

9. Specifying a maximum transfer rate

You can specify the maximum transfer rate for both uploads and downloads with the option. The rate is measured in bytes/second unless a suffix, such for kilobytes, for megabytes, and gigabytes, is added to the end of the specified number.

10. HTTP/2 support check

If you have the latest curl release, you can use the option to check if a particular URL supports the new HTTP/2 protocol. Therefore, if the site does support HTTP/2, you will see in the header instead of .

11. Retrieving a particular byte-range

Use the option to retrieve a particular byte-range of a document. This essentially means to retrieve a particular portion of a file. These byte-range commands can be specified in a number of ways (e.g. or ). Read our article to learn more about Byte-Range Requests.

POST запросы cUrl в PHP

$array = array(
'login' => 'user',
'password' => '123'
);

$ch = curl_init('https://asgeto.ru');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $array);

// Или предать массив строкой:
// curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($array, '', '&'));

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);

echo $html;

Функция file_get_contents() так же умеет отправлять POST запросы. Для этого нужно использовать заголовки:

$headers = stream_context_create(array(
'http' => array(
'method' => 'POST',
'header' => 'Content-Type: application/x-www-form-urlencoded' . PHP_EOL,
'content' => 'login=user&password=123',
),
));

echo file_get_contents('https://asgeto.ru', false, $headers);

Строки запроса и параметры

Параметры почтового индекса (), идентификатора приложения () и единиц () были переданы в конечную точку с помощью «строк запроса». Знак добавленный к URL указывает начало строки запроса. Параметры строки запроса — это параметры, которые появляются после знака :

После строки запроса каждый параметр объединяется с другими параметрами через символ амперсанда . Порядок параметров в строке запроса не имеет значения. Порядок имеет значение только в том случае, если параметры находятся слева от строки запроса (и, следовательно, являются частью самого URL-адреса). Любые настраиваемые части конечной точки, которые появляются перед строкой запроса, называются (разберем их позже).

Почему cURL?

На самом деле, существует немало альтернативных способов выборки содержания веб-страницы. Во многих случаях, главным образом из-за лени, я использовал простые PHP функции вместо cURL:

$content = file_get_contents("http://www.nettuts.com");
// или
$lines = file("http://www.nettuts.com");
// или
readfile("http://www.nettuts.com");

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

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

Как пользоваться curl?

Мы рассмотрели все, что касается теории работы с утилитой curl, теперь пришло время перейти к практике, и рассмотреть примеры команды curl.

Загрузка файлов

Самая частая задача — это загрузка файлов linux. Скачать файл очень просто. Для этого достаточно передать утилите в параметрах имя файла или html страницы:

curl https://raw.githubusercontent.com/curl/curl/master/README.md

Но тут вас ждет одна неожиданность, все содержимое файла будет отправлено на стандартный вывод. Чтобы записать его в какой-либо файл используйте:

curl -o readme.txt https://raw.githubusercontent.com/curl/curl/master/README.md

А если вы хотите, чтобы полученный файл назывался так же, как и файл на сервере, используйте опцию -O:

curl -O https://raw.githubusercontent.com/curl/curl/master/README.md

Если загрузка была неожиданно прервана, вы можете ее возобновить:

curl -# -C — -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz

Если нужно, одной командой можно скачать несколько файлов:

curl -O https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README

Еще одна вещь, которая может быть полезной администратору — это загрузка файла, только если он был изменен:

curl -z 21-Dec-17 https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README

Данная команда скачает файл, только если он был изменен после 21 декабря 2017.

Ограничение скорости

Вы можете ограничить скорость загрузки до необходимого предела, чтобы не перегружать сеть с помощью опции -Y:

curl —limit-rate 50K -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz

Здесь нужно указать количество килобайт в секунду, которые можно загружать. Также вы можете разорвать соединение если скорости недостаточно, для этого используйте опцию -Y:

curl -Y 100 -O https://raw.githubusercontent.com/curl/curl/master/README.md

Передача файлов

Загрузка файлов, это достаточно просто, но утилита позволяет выполнять и другие действия, например, отправку файлов на ftp сервер. Для этого существует опция -T:

curl -T login.txt ftp://speedtest.tele2.net/upload/

Или проверим отправку файла по HTTP, для этого существует специальный сервис:

curl -T ~/login.txt http://posttestserver.com/post.php

В ответе утилита сообщит где вы можете найти загруженный файл.

Отправка данных POST

Вы можете отправлять не только файлы, но и любые данные методом POST. Напомню, что этот метод используется для отправки данных различных форм. Для отправки такого запроса используйте опцию -d. Для тестирования будем пользоваться тем же сервисом:

curl -d «field1=val&fileld2=val1″http://posttestserver.com/post.php

Если вас не устраивает такой вариант отправки, вы можете сделать вид, что отправили форму. Для этого есть опция -F:

curl -F «password=@pass;type=text/plain» http://posttestserver.com/post.php

Здесь мы передаем формой поле password, с типом обычный текст, точно так же вы можете передать несколько параметров.

Передача и прием куки

Куки или Cookie используются сайтами для хранения некой информации на стороне пользователя. Это может быть необходимо, например, для аутентификации. Вы можете принимать и передавать Cookie с помощью curl. Чтобы сохранить полученные Cookie в файл используйте опцию -c:

curl -c cookie.txt http://posttestserver.com/post.php

Затем можно отправить cookie curl обратно:

curl -b cookie.txt http://posttestserver.com/post.php

Передача и анализ заголовков

Не всегда нам обязательно нужно содержимое страницы. Иногда могут быть интересны только заголовки. Чтобы вывести только их есть опция -I:

curl -I https://losst.ru

А опция -H позволяет отправить нужный заголовок или несколько на сервер, например, можно передать заголовок If-Modified-Since чтобы страница возвращалась только если она была изменена:

curl -I —хедер ‘If-Modified-Since: Mon, 26 Dec 2016 18:13:12 GMT’ https://losst.ru

Аутентификация curl

Если на сервере требуется аутентификация одного из распространенных типов, например, HTTP Basic или FTP, то curl очень просто может справиться с такой задачей. Для указания данных аутентификации просто укажите их через двоеточие в опции -u:

curl -u ftpuser:ftppass -T — ftp://ftp.testserver.com/myfile_1.txt

Точно так же будет выполняться аутентификация на серверах HTTP.

Использование прокси

Если вам нужно использовать прокси сервер для загрузки файлов, то это тоже очень просто. Достаточно задать адрес прокси сервера в опции -x:

curl -x proxysever.test.com:3128 http://google.co.in

Запросы и ответы содержат заголовки

При вводе адреса веб-сайта мы видим только текст ответа. Но на самом деле происходит гораздо больше процессов. Когда мы делаем запрос, мы отправляем заголовок запроса, который содержит информацию о запросе. Ответ также содержит заголовок ответа.

Для того чтобы увидеть заголовок ответа в запрос curl, добавим ключ :

Заголовок будет включен над телом ответа:

Чтобы в ответе получить только заголовок, используем ключ

Заголовок содержит метаданные ответа. Вся эта информация передается в браузер при запросе URL в нашем браузере (например, при просмотре веб-страницы в Интернете), но браузер не отображает эту информацию. Можно просмотреть информацию заголовка с помощью консоли Chrome Developer Tools, перейдя на вкладку .

Теперь давайте уточним метод. Метод GET (чтение) подразумевается по умолчанию, когда не указан другой метод, но мы сделаем это здесь явно с параметром -X:

При посещении веб-сайта мы отправляем запрос, используя метод GET. Существуют и другие методы HTTP, которые можно использовать при взаимодействии с REST API. Вот общие методы, используемые при работе с конечными точками REST:

HTTP метод Описание
POST Создание ресурса
GET Чтение (получение) ресурса
PUT Обновление ресурса
DELETE Удаление ресурса

Note: Метод GET используется по умолчанию в запросах curl. При использовании curl для выполнения запросов HTTP, отличных от GET, необходимо указывать нужный метод HTTP.

Произвольные заголовки запроса

Возможно, вам понадобится изменять или добавлять элементы
отдельных запросов curl.

К примеру, вы можете изменить запрос POST на PROPFIND и отправить
данные как «Content-Type: text/xml» (вместо обычного
Content-Type):

        # curl -d "<xml>" -H "Content-Type: text/xml" -X PROPFIND url.com

Вы можете удалить какой-нибудь заголовок, указав его без содержимого.
Например, вы можете удалить заголовок ‘Host:’, тем самым сделав
запрос «пустым»:

        # curl -H "Host:" http://mysite.com

Также вы можете добавлять заголовки. Возможно, вашему серверу
потребуется заголовок ‘Destination:’:

        # curl -H "Destination: http://moo.com/nowhere" http://url.com

9. Перенаправления (redirects)

Отвечая на ваш запрос, сервер вместо самой страницы может вернуть
указание, куда браузер должен пойти дальше, чтобы попасть на нужную
страницу. Заголовок, который указывает браузеру такое перенаправление
— это ‘Location:’.

По умолчанию curl не идет по адресу, указанному в ‘Location:’, а
просто показывает страницу как обычно. Но можно его направить
следующим образом:

        # curl -L www.sitethatredirects.com

Если вы используете curl для POST-запросов на сайт, который сразу же
перенаправляет на другую страницу, вы можете смело использовать
связку -L и -d/-F. Curl сформирует POST-запрос для первой страницы, а
затем GET-запрос для последующей.

13. Отладка

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

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

  • Убедитесь, что вы проверяете на
    cookies и используете их при необходимости (ключ чтения -b и
    сохранения -c)

  • Укажите в поле ‘user-agent’ один
    из последних популярных браузеров

  • Заполните поле ‘referer’ как это
    делает браузер

  • Если вы используете POST-запросы, убедитесь, что все поля
    передаются в том же порядке, что и браузер (см. выше, пункт 4.5)

Хороший помощник в этом нелегком деле — плагин для Mozilla/Firefox
,
который позволяет просматривать все заголовки, которые отправляет и
принимает этот браузер (даже при использовании HTTPS).

Более низкоуровневый подход — захват HTTP-траффика в сети с
помощью программ, таких как ethereal или tcpdump, с последующим
анализом, какие заголовки были получены и отправлены браузером (HTTPS
делает этот подход неэффективным).

Cookies

С помощью cookies веб-браузеры контролируют состояние на стороне
клиента. Cookie — это имя с присоединенным содержимым. Сервер при
помощи отправки cookies сообщает клиенту путь и имя хоста, по
которому в следующий раз должны быть отправлены cookies, сообщает
время жизни cookies и некоторые другие параметры.

Когда клиент соединяется с сервером по адресу, указанному в
принятом cookie, клиент посылает этот cookie к серверу (если время
жизни не истекло).

Многие приложения и сервера используют этот метод, чтобы
объединить нескольких запросов в одну логическую сессию. Чтобы curl
также мог выполнять такую функцию, мы должны уметь сохранять и
отправлять cookies, как и делают браузеры.

Простейший способ отправить cookie к серверу при получении
страницы с помощью curl, это добавить соответствующий ключ в
командной строке:

        # curl -b "name=Daniel" www.cookiesite.com

Cookies отправляются как обычные HTTP-заголовки. Это позволяет curl
сохранять cookies, сохраняя заголовки. Сохранение cookies с помощью
curl выполняется командой:

        # curl -D headers_and_cookies www.cookiesite.com

(кстати, для сохранения cookies лучше использовать ключ -c, об этом
ниже).

У curl имеется полнофункциональный обработчик cookies, который
полезен, когда вы хотите соединиться в очередной раз к серверу и
использовать cookies, сохраненные в прошлый раз (либо подработанные
вручную). Для использования cookies, сохраненных в файле, вызовите
curl так:

        # curl -b stored_cookies_in_file www.cookiesite.com

«Cookie-движок» curl включается, когда вы указываете ключ
-b. Если вы хотите, чтобы curl лишь воспринимал cookies, используйте
-b с указанием файла, которого не существует. Например, если вы
хотите, чтобы curl принял cookies со страницы, а затем пошел по
перенаправлению (возможно, отдав принятый только что cookie), то
можно вызывать curl так:

        # curl -b nada -L www.cookiesite.com

Curl умеет читать и писать cookie-файлы, имеющие формат Netscape и
Mozilla. Это удобный способ обмениваться cookies между браузерами и
автоматическими скриптами. Ключ -b автоматически определяет, является
ли данный файл cookie-файлом указанных браузеров и обрабатывает его
соответствующим образом, а используя ключ -c/—cookie-jar, вы можете
заставить curl записать новый cookie-файл по завершении операции:

        # curl -b cookies.txt -c newcookies.txt www.cookiesite.com

Сокеты, multipart/form-data

// устанавливаем соединение с сервером
$fp = fsockopen('server.com', 80, $errno, $errstr, 30);
if (!$fp) die($errstr.' ('.$errno.')');

$name = 'Евгений';
$message = 'Какое-то сообщение от пользователя';
$file = 'image.jpg';
// содержимое файла
$content = file_get_contents($file);

// разделитель
$boundary = md5(uniqid(time()));

$body = '--'.$boundary."\r\n";
$body = $body.'Content-Disposition: form-data; name="name"'."\r\n\r\n";
$body = $body.$name."\r\n";

$body = $body.'--'.$boundary."\r\n";
$body = $body.'Content-Disposition: form-data; name="message"'."\r\n\r\n";
$body = $body.$message."\r\n";

$body = $body.'--'.$boundary."\r\n";
$body = $body.'Content-Disposition: form-data; name="upload"; filename="image.jpg"'."\r\n";
$body = $body.'Content-Type: image/jpeg'."\r\n";
$body = $body.'Content-Transfer-Encoding: binary'."\r\n\r\n";
$body = $body.$content."\r\n";

$body = $body.'--'.$boundary.'--';

// пишем в сокет метод, URI и протокол
fwrite($fp, 'POST /get.php HTTP/1.1'."\r\n");
// а также имя хоста
fwrite($fp, 'Host: server.com'."\r\n");
// отправляем заголовки
fwrite($fp, 'Content-Type: multipart/form-data; boundary='.$boundary."\r\n");
fwrite($fp, 'Content-Length: '.strlen($body)."\r\n\r\n");
// теперь передаем данные
fwrite($fp, $body);

// получаем ответ
$result = '';
while ( !feof($fp) ) $result .= fgets($fp, 1024);
// закрываем соединение
fclose($fp);
// выводим ответ в браузер
echo $result;

Файл get.php на сервере http://server.com:

print_r( $_POST );
print_r( $_FILES );
move_uploaded_file($_FILES'upload''tmp_name', 'image.jpg')

Результат:

HTTP/1.1 200 OK
Server: Apache/2.0 (Win32) PHP/5.1
X-Powered-By: PHP/5.1
Content-Length: 310

Array
(
     => Евгений
     => Какое-то сообщение от пользователя
)
Array
(
     => Array
        (
             => image.jpg
             => image/jpeg
             => C:\Windows\Temp\phpA457.tmp
             => 0
             => 416919
        )
)

Результат запроса

Ну а после того, как CURL-запрос был выполнен, неплохо бы было знать, что он вернул:

А вот какие еще даные мы можем получить:

Индекс массива Значение Индекс массива Значение
url string(17) «https://intop24.ru» content_type string(24) «text/html; charset=utf-8»
http_code int(200) header_size int(218)
request_size int(49) filetime int(-1)
ssl_verify_result int(0) redirect_count int(0)
total_time float(0.009419) namelookup_time float(1.3E-5)
connect_time float(1.3E-5) pretransfer_time float(1.4E-5)
size_upload float(0) size_download float(46523)
speed_download float(4939271) speed_upload float(0)
download_content_length float(-1) upload_content_length float(0)
starttransfer_time float(0.009374) redirect_time float(0)
certinfo array(0) { } redirect_url string(0) «»

Предварительные сведения

Протокол HTTP

HTTP — это протокол, используемый при обмене данных между веб-сервером и программой-клиентом (например, браузером). Он состоит из строк ASCII-текста, отсылаемых от клиента к серверу для запроса какого-либо действия. При получении запроса сервер отвечает клиенту несколькими служебными текстовыми строками, а затем выдает запрошенное содержимое.

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

URL

URL (Uniform Resource Locator — единый указатель ресурса) задает адрес определенного ресурса в Интернет. Например, URL веб-страницы cURL, записывается так: .

Формы

Формы представляют собой наборы полей, размещенные на веб-странице. Пользователь вводит в эти поля данные, затем нажимает на кнопку «OK» или «Отправить», после чего данные отправляются на сервер. Сервер принимает данные и решает, как поступить дальше: искать ли информацию в базе данных, показать ли введенный адрес на карте или использовать информацию для аутентификации пользователя. Разумеется, «решает» — означает, что на стороне сервера должна быть какая-то программа, которая принимает и обрабатывает присланные данные. Простейший пример: форма запроса поисковика Google.

Справка

Справку по curl можно получить, набрав в командной строке

$ curl --help

или

$ curl --manual

— приглашение командной строки.

Отправка данных методом POST

Команда ниже отправляет POST запрос на сервер аналогично тому, как пользователь, заполнив HTML форму, нажал бы кнопку «Отправить». Данные будут отправлены в формате .

> curl -d "key1=value1&key2=value2" http://www.example.com
> curl --data "key1=value1&key2=value2" http://www.example.com

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

> curl --data-urlencode "name=Василий" --data-urlencode "surname=Пупкин" http://www.example.com

Если значение опции начинается с , то после него должно быть имя файла с данными (или дефис — тогда будут использованы данные из стандартного ввода). Пример получения данных из файла для отправки POST-запроса:

> curl --data @data.txt http://www.example.com

Содержимое файла :

key1=value1&key2=value2

Массив , который будет содержать данные этого запроса:

Array
(
     => value1
     => value2
)

Пример URL-кодирования данных из файла перед отправкой POST-запроса:

> curl --data-urlencode name@username.txt http://www.example.com

Содержимое файла :

Иванов Иван Иванович

Массив , который будет содержать данные этого запроса:

Array
(
     = Иванов Иван Иванович
)

Формы

Формы — основной способ представления web-сайта как HTML-страницы
с полями, в которые пользователь вводит данные, и затем нажимает на
кнопку ‘OK’ или ‘Отправить’, после чего данные отсылаются на сервер.
Затем сервер использует принятые данные и решает, как действовать
дальше: искать информацию в базе данных, показать введенный адрес на
карте, добавить сообщение об ошибке или использовать информацию для
аутентификации пользователя. Разумеется, на стороне сервера имеется
какая-то программа, которая принимает ваши данные.

4.1 GET

GET-форма использует метод GET, например следующим образом:

        <form method="GET" action="junk.cgi">
        <input type=text name="birthyear">
        <input type=submit name=press value="OK">
        </form>

Если вы откроете этот код в вашем браузере, вы увидите форму с
текстовым полем и кнопку с надписью «OK». Если вы введете
‘1905’ и нажмете OK, браузер создаст новый URL, по которому и
проследует. URL будет представляться строкой, состоящей из пути
предыдущего URL и строки, подобной
«junk.cgi?birthyear=1905&press=OK».

Например, если форма располагалась по адресу
«www.hotmail.com/when/birth.html», то при нажатии на кнопку
OK вы попадете на URL
«www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK».

Большинство поисковых систем работают таким образом.

Чтобы curl сформировал GET-запрос, просто введите то, что
ожидалось от формы:

        # curl "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK"

4.2 POST

Метод GET приводит к тому, что вся введенная информация
отображается в адресной строке вашего браузера. Может быть это
хорошо, когда вам нужно добавить страницу в закладки, но это
очевидный недостаток, когда вы вводите в поля формы секретную
информацию, либо когда объем информации, вводимый в поля, слишком
велик (что приводит к нечитаемому URL).

Протокол HTTP предоставляет метод POST. С помощью него клиент
отправляет данные отдельно от URL и поэтому вы не увидете их в
адресной строке.

Форма, генерирующая POST-запрос, похожа на предыдущую:

        <form method="POST" action="junk.cgi">
        <input type=text name="birthyear">
        <input type=submit name=press value=" OK ">
        </form>

Curl может сформировать POST-запрос с теми же данными следующим
образом:

        # curl -d "birthyear=1905&press=%20OK%20" www.hotmail.com/when/junk.cgi

Этот POST-запрос использует ‘Content-Type
application/x-www-form-urlencoded’, это самый широко используемый
способ.

Данные, которые вы отправляете к серверу, должны быть правильно
закодированы
, curl не будет делать это за вас. К примеру, если вы
хотите, чтобы данные содержали пробел, вам нужно заменить этот пробел
на %20 и т.п. Недостаток внимания к этому вопросу — частая ошибка,
из-за чего данные передаются не так, как надо.

4.3 Загрузка файлов с помощью POST (File Upload POST)

В далеком 1995 был определен дополнительный способ передавать
данные по HTTP. Он задокументирован в RFC 1867, поэтому этот способ
иногда называют RFC1867-posting.

Этот метод в основном разработан для лучшей поддержки загрузки
файлов. Форма, которая позволяет пользователю загрузить файл,
выглядит на HTML примерно следующим образом:

        <form method="POST" enctype='multipart/form-data' action="upload.cgi">
        <input type=file name=upload>
        <input type=submit name=press value="OK">
        </form>

Заметьте, что тип содержимого Content-Type установлен в
multipart/form-data.

Чтобы отослать данные в такую форму с помощью curl, введите
команду:

        # curl -F upload=@localfilename -F press=OK 

4.4 Скрытые поля

Обычный способ для передачи информации о состоянии в
HTML-приложениях — использование скрытых полей в формах. Скрытые поля
не заполняются, они невидимы для пользователя и передаются так же,
как и обычные поля.

Простой пример формы с одним видимым полем, одним скрытым и
кнопкой ОК:

        <form method="POST" action="foobar.cgi">
        <input type=text name="birthyear">
        <input type=hidden name="person" value="daniel">
        <input type=submit name="press" value="OK">
        </form>

Чтобы отправить POST-запрос с помощью curl, вам не нужно думать о
том, скрытое поле или нет. Для curl они все одинаковы:

        # curl -d "birthyear=1905&press=OK&person=daniel" 

4.5 Узнать, как выглядит POST-запрос

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

Простой способ увидеть свой POST-запрос, это сохранить
HTML-страницу с формой на диск, изменить метод на GET, и нажать
кнопку ‘Отправить’ (вы можете также изменить URL, которому будет
передаваться данные).

Вы увидите, что данные присоединились к URL, отделенные символами
‘?’, как и предполагается при использовании GET-форм.

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

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

Adblock
detector