cURL — это программное обеспечение, состоящее из утилиты командной строки и библиотеки, предназначенное для передачи данных по разнообразным протоколам (HTTP, FTP, POP3, IMAP, SMTP и мн. др.). Мы рассмотрим только утилиту командной строки, название которой мы будем записывать как "curl". Навыки, полученные при ее использовании, позволяют легко освоить работу с библиотекой libcurl. Кроме того, мы ограничимся формированием HTTP-запросов: GET и POST.

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

Протокол HTTP

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

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

URL

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

Формы

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

Справка

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

$ curl --help

или

$ curl --manual

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

Получить содержимое страницы (GET)

Самый простой и обычный HTTP-запрос — получить содержимое заданного URL. URL может ссылаться на веб-страницу, изображение или какой либо-другой файл. Клиент отсылает GET-запрос на сервер и получает запрашиваемый документ. Если выполнить команду

$ curl http://curl.haxx.se

вы получите веб-страницу, выведенную в окно терминала (точнее, в стандартный вывод). Чтобы сохранить эту страницу в файл curl.html, нужно указать

$ curl http://curl.haxx.se -o "curl.html"

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

Отправить GET-запрос из формы

Форма запроса может использовать метод GET. Например, так:

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

Если вы откроете этот код в браузере, то увидите форму с текстовым полем и кнопкой с надписью "OK". Если вы, например, введете в форму '1990' и нажмете "OK", то браузер создаст новый URL, по которому и проследует. Этот URL будет являться строкой, состоящей из предыдущего URL и строки запроса, вроде следующей: foo.cgi?year=1990&press=OK. Так, если форма располагалась по адресу www.foo.com/year.html (адрес взят "с потолка"!), то при нажатии на кнопку "OK" вы попадете на URL www.foo.com/foo.cgi?year=1990&press=OK.

Для формирования GET-запроса, введите то, что ожидалось от формы:

$ curl "www.foo.com/foo.cgi?year=1990&press=OK"

Метод POST

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

Форма, генерирующая POST-запрос, отличается от предыдущей лишь методом отправки:

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

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

$ curl -d "year=1990&press=%20OK%20" www.foo.com/foo.cgi

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

Загрузка файлов с помощью POST

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

 <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 [URL страницы с формой]

Скрытые поля формы

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

Пример формы с одним видимым и одним скрытым полями:

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

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

$ curl -d "year=1990&press=OK&person=daniel" [URL]

Как выглядит POST-запрос "изнутри"

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

Простейший способ увидеть свой POST-запрос заключается в следующем:

  1. сохранить веб-страницу с формой на диск;
  2. изменить метод на GET;
  3. нажать кнопку "Отправить" (вы можете также изменить URL, которому будет передаваться данные).

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



Комментарии

comments powered by Disqus