- Заметки, идеи и скрипты
- Как сделать мир лучше с помощью компьютера
- Примеры curl запросов из командной строки
- Утилита командной строки CURL
- Следовать за редиректами
- Сохранить вывод в файл
- Загрузить файл, только если он изменён
- Прохождение аутентификации HTTP
- Получение и отправка cookie
- Получение и отправка заголовков
- Отправка данных методом POST
- Загрузка файлов методом POST
- Работа по протоколу FTP
- Создание GET и POST-запросов с помощью Curl
- Предварительные сведения
- Протокол HTTP
- Формы
- Справка
- Получить содержимое страницы (GET)
- Отправить GET-запрос из формы
- Метод POST
- Загрузка файлов с помощью POST
- Скрытые поля формы
- Как выглядит POST-запрос «изнутри»
- Читайте также
- Комментарии
- Как сделать POST-запрос с помощью cURL
- Выполнение запроса POST
- Указание Content-Type
- Загрузка файлов
- Выводы
Заметки, идеи и скрипты
Как сделать мир лучше с помощью компьютера
Примеры curl запросов из командной строки
Для быстрого тестирования запросов к web сервисам очень удобно использовать curl запросы из командной строки. Простой GET запрос легко ввести прямиком в браузере, но вот с POST уже будет сложнее. Разумеется есть множество программ с удобным интерфейсом, но часто бывает что они не всегда под рукой, не установлены или надо написать универсальную инструкцию. В таком случае гораздо быстрее открыть терминал, ввести команду и сразу получить результат. Для установки curl на linux достаточно выполнить команду
Здесь я приведу несколько наиболее типичных примеров CURL запросов.
Пример CURL POST запроса и CURL GET запроса
curl -X POST http://127.0.0.1/page
curl -X GET http://127.0.0.1/page
Пример отправки данных постом
вариант 1: curl -X POST -d «data1=1&data2=2″ http://127.0.0.1/page
вариант 2: curl -X POST -d ‘<«data1″: «1″, «data2″: «2″>’ http://127.0.0.1/page
О том как программно загружать файлы с помощью curl смотрите в статье о загрузке файлов курлом
Пример отправки файла
curl -i -X POST —form datafile=@/path/to/file.pdf http://127.0.0.1/page
Обратите внимание на параметр -i, определяющий получение от сервера только заголовка. Параметр не обязательный, но ведь обычно достаточно только знать загрузился файл или нет.
Пример CURL запроса с авторизацией
curl -u username:password http://127.0.0.1/page -XPOST -d «id=123″ -v
О полезном параметре -v ниже.
Пример CURL JSON запроса
curl -X POST http://127.0.0.1/page -d ‘<«id»: «123″>’ -H «Content-Type:application/json»
Некоторые сервисы бракуют запросы без указания content-type, поэтому в случае json запроса — лучше всегда отправлять хэдер json.
Из полезных параметров стоит рассмотреть команду -v (verbose) чтобы получить максимум информации по запросу.
О том как работать с curl запросом через прокси смотрите в данной статье.
Приведённых примеров должно хватить для использования в 95% , если понадобятся более тонкие запросы, то используйте
Утилита командной строки CURL
CURL — утилита командной строки для Linux или Windows, поддерживает работу с протоколами: FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, POP3, IMAP и SMTP. Она отлично подходит для имитации действий пользователя на страницах сайтов и других операций с URL адресами. Поддержка CURL добавлена в множество различных языков программирования и платформ.
Для начала скачаем саму утилиту, для этого переходим на официальный сайт утилиты, в раздел Download. После скачивания архива для своей платформы (у меня это Windows 64 bit), распаковываем архив. Чтобы иметь возможность работать с HTTPS и FTPS, устанавливаем сертификат безопасности url-ca-bundle.crt , который находится в папке curl/bin .
Запускаем командную строку, переходим в директорию curl/bin и пытаемся скачать главную страницу Google:
Опция -X позволяет задать тип HTTP-запроса вместо используемого по умолчанию GET. Дополнительные запросы могут быть POST, PUT и DELETE или связанные с WebDAV — PROPFIND, COPY, MOVE и т.п.
Следовать за редиректами
Сервер Google сообщил нам, что страница google.com перемещена (301 Moved Permanently), и теперь надо запрашивать страницу www.google.com . С помощью опции -L укажем CURL следовать редиректам:
Сохранить вывод в файл
Чтобы сохранить вывод в файл, надо использовать опции -o или -O :
- -o ( o нижнего регистра) — результат будет сохранён в файле, заданном в командной строке;
- -O ( O верхнего регистра) — имя файла будет взято из URL и будет использовано для сохранения полученных данных.
Сохраняем страницу Google в файл google.html :
Сохраняем документ gettext.html в файл gettext.html :
Загрузить файл, только если он изменён
Опция -z позволяет получить файлы, только если они были изменены после определённого времени. Это будет работать и для FTP и для HTTP. Например, файл archive.zip будет получен, если он изменялся после 20 августа 2018 года:
Команда ниже загрузит файл archive.zip , если он изменялся до 20 августа 2018 года:
Прохождение аутентификации HTTP
Опция -u позволяет указать данные пользователя (имя и пароль) для прохождения базовой аутентификаци (Basic HTTP Authentication):
Получение и отправка cookie
Cookie используются сайтами для хранения некой информации на стороне пользователя. Сервер сохраняет cookie на стороне клиента (т.е. в браузере), отправляя заголовки:
А браузер, в свою очередь, отправляет полученные cookie обратно на сервер при каждом запросе. Разумеется, тоже в заголовках:
Передать cookie на сервер, как будто они были ранее получены от сервера:
Чтобы сохранить полученные сookie в файл:
Затем можно отправить сохраненные в файле cookie обратно:
Файл cookie.txt имеет вид:
Получение и отправка заголовков
По умолчанию, заголовки ответа сервера не показываются. Но это можно исправить:
Если содержимое страницы не нужно, а интересны только заголовки (будет отправлен HEAD запрос):
Посмотреть, какие заголовки отправляет CURL при запросе, можно с помощью опции -v , которая выводит более подробную информацию:
- Строка, начинающаяся с > означает заголовок, отправленный серверу
- Строка, начинающаяся с означает заголовок, полученный от сервера
- Строка, начинающаяся с * означает дополнительные данные от CURL
А вот так можно отправить свой заголовок:
Отправка данных методом POST
Команда ниже отправляет POST запрос на сервер аналогично тому, как пользователь, заполнив HTML форму, нажал бы кнопку «Отправить». Данные будут отправлены в формате application/x-www-form-urlencoded .
Параметр —data аналогичен —data-ascii , для отправки двоичных данных необходимо использовать параметр —data-binary . Для URL-кодирования полей формы нужно использовать —data-urlencode .
Если значение опции —data начинается с @ , то после него должно быть имя файла с данными (или дефис — тогда будут использованы данные из стандартного ввода). Пример получения данных из файла для отправки POST-запроса:
Содержимое файла data.txt :
Массив $_POST , который будет содержать данные этого запроса:
Пример URL-кодирования данных из файла перед отправкой POST-запроса:
Содержимое файла username.txt :
Массив $_POST , который будет содержать данные этого запроса:
Загрузка файлов методом POST
Для HTTP запроса типа POST существует два варианта передачи полей из HTML форм, а именно, используя алгоритм application/x-www-form-urlencoded и multipart/form-data . Алгоритм первого типа создавался давным-давно, когда в языке HTML еще не предусматривали возможность передачи файлов через HTML формы.
Со временем возникла необходимость через формы отсылать еще и файлы. Тогда консорциум W3C взялся за доработку формата POST запроса, в результате чего появился документ RFC 1867. Форма, которая позволяет пользователю загрузить файл, используя алгоритм multipart/form-data , выглядит примерно так:
Чтобы отправить на сервер данные такой формы:
Скрипт upload.php , который принимает данные формы:
Работа по протоколу FTP
Скачать файл с FTP-сервера:
Если заданный FTP путь является директорией, то по умолчанию будет выведен список файлов в ней:
Создание GET и POST-запросов с помощью Curl
cURL — это программное обеспечение, состоящее из утилиты командной строки и библиотеки, предназначенное для передачи данных по разнообразным протоколам (HTTP, FTP, POP3, IMAP, SMTP и мн. др.). Мы рассмотрим только утилиту командной строки, название которой мы будем записывать как «curl». Навыки, полученные при ее использовании, позволяют легко освоить работу с библиотекой libcurl. Кроме того, мы ограничимся формированием HTTP-запросов: GET и POST.
Предварительные сведения
Протокол HTTP
HTTP — это протокол, используемый при обмене данных между веб-сервером и программой-клиентом (например, браузером). Он состоит из строк ASCII-текста, отсылаемых от клиента к серверу для запроса какого-либо действия. При получении запроса сервер отвечает клиенту несколькими служебными текстовыми строками, а затем выдает запрошенное содержимое.
Используя ключ -v , можно увидеть, какие именно команды curl отсылает серверу. Этот ключ дает возможность разобраться в особенностях взаимодействия curl и веб-сервера и помогает отладить запрос.
URL (Uniform Resource Locator — единый указатель ресурса) задает адрес определенного ресурса в Интернет. Например, URL веб-страницы cURL, записывается так: http://curl.haxx.se .
Формы
Формы представляют собой наборы полей, размещенные на веб-странице. Пользователь вводит в эти поля данные, затем нажимает на кнопку «OK» или «Отправить», после чего данные отправляются на сервер. Сервер принимает данные и решает, как поступить дальше: искать ли информацию в базе данных, показать ли введенный адрес на карте или использовать информацию для аутентификации пользователя. Разумеется, «решает» — означает, что на стороне сервера должна быть какая-то программа, которая принимает и обрабатывает присланные данные. Простейший пример: форма запроса поисковика Google.
Справка
Справку по curl можно получить, набрав в командной строке
$ — приглашение командной строки.
Получить содержимое страницы (GET)
Самый простой и обычный HTTP-запрос — получить содержимое заданного URL. URL может ссылаться на веб-страницу, изображение или какой либо-другой файл. Клиент отсылает GET-запрос на сервер и получает запрашиваемый документ. Если выполнить команду
вы получите веб-страницу, выведенную в окно терминала (точнее, в стандартный вывод). Чтобы сохранить эту страницу в файл curl.html , нужно указать
Все HTTP-ответы содержат набор заголовков, которые обычно скрыты. Чтобы увидеть эти заголовки вместе с самим документом, используйте ключ -i .
Отправить GET-запрос из формы
Форма запроса может использовать метод GET. Например, так:
Если вы откроете этот код в браузере, то увидите форму с текстовым полем и кнопкой с надписью «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-запроса, введите то, что ожидалось от формы:
Метод POST
Метод GET приводит к тому, что вся введенная информация отображается в адресной строке браузера. Очевидно, что это не самый лучший способ в тех случаях, когда нужно отправить конфиденциальные данные или когда объем введенной информации очень велик. Для решения этой проблемы протокол HTTP предоставляет пользователю еще один метод — POST. С его помощью клиент отправляет данные отдельно от URL, и поэтому в адресной строке браузера вы их не увидите.
Форма, генерирующая POST-запрос, отличается от предыдущей лишь методом отправки:
curl сформирует POST-запрос с теми же данными следующим образом:
Обратите внимание на то, что данные, которые вы отправляете серверу, должны быть правильно закодированы. curl не сделает этого за вас. К примеру, если вы хотите, чтобы данные содержали пробел, то вам нужно заменить этот пробел на %20 и т. п. Это одна из самых распространенных ошибок, в результате чего данные передаются не так, как нужно.
Загрузка файлов с помощью POST
Форма, с помощью которой пользователь может загрузить файл, выглядит примерно так:
Заметьте, что тип содержимого Content-Type установлен в multipart/form-data .
Чтобы с помощью curl отослать данные в такую форму, введите:
Скрытые поля формы
Скрытые поля в формах являются одним из наиболее распространенных способов передачи информации о состоянии HTML-приложения. Такие поля не заполняются, они невидимы для пользователя, но передаются так же, как и обычные поля.
Пример формы с одним видимым и одним скрытым полями:
Чтобы отправить POST-запрос с помощью curl, вам не нужно задумываться о том, скрыто поле или нет — для curl все поля одинаковы:
Как выглядит POST-запрос «изнутри»
Когда с помощью curl вы заполняете форму и отсылаете ее данные на сервер, вы наверняка хотите, чтобы сформированный curl POST-запрос выглядел так же, как если бы он был выполнен с помощью браузера.
Простейший способ увидеть свой POST-запрос заключается в следующем:
- сохранить веб-страницу с формой на диск;
- изменить метод на GET;
- нажать кнопку «Отправить» (вы можете также изменить URL, которому будет передаваться данные).
Вы увидите, что данные присоединились к URL и разделены символами ? , как это и предполагается при использовании GET-форм.
Читайте также
Комментарии
Дмитрий Храмов
Компьютерное моделирование и все, что с ним связано: сбор данных, их анализ, разработка математических моделей, софт для моделирования, визуализации и оформления публикаций. Ну и за жизнь немного.
Как сделать POST-запрос с помощью cURL
cURL — это утилита командной строки для передачи данных с или на удаленный сервер с использованием одного из поддерживаемых протоколов. Он установлен по умолчанию в macOS и большинстве дистрибутивов Linux.
cURL используется разработчиками для тестирования API , просмотра заголовков ответов и выполнения HTTP-запросов.
В этой статье мы собираемся объяснить, как использовать cURL для выполнения запросов POST. Метод HTTP POST используется для отправки данных на удаленный сервер.
Выполнение запроса POST
Общая форма команды curl для выполнения запроса POST следующая:
Тип тела запроса указывается его заголовком Content-Type .
Обычно запрос POST отправляется через HTML-форму. Данные, отправляемые в форму, обычно кодируются в типе содержимого multipart/form-data или application/x-www-form-urlencoded .
Чтобы создать запрос POST, используйте параметр -F , за которым следует пара field=value . В следующем примере показано, как отправить POST-запрос в форму с полями «имя» и «электронная почта»:
Когда используется опция -F , curl отправляет данные с использованием Content-Type multipart/form-data .
Другой способ сделать запрос POST — использовать параметр -d . Это заставляет curl отправлять данные с использованием Content-Type application/x-www-form-urlencoded Content-Type.
Если параметр -d используется более одного раза, вы можете объединить данные с помощью символа & :
Указание Content-Type
Чтобы установить определенный заголовок или Content-Type, используйте параметр -H . Следующая команда устанавливает тип запроса POST на application/json и отправляет объект JSON:
Загрузка файлов
Чтобы отправить файл с помощью curl , просто добавьте символ @ перед местоположением файла. Файл может быть архивом, изображением, документом и т. Д.
Выводы
Мы показали вам, как использовать curl для выполнения запросов POST. Дополнительные сведения о curl см. На странице документации по Curl .
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.