Использование команды cURL в скрипте Bash может быть полезным, но почему?
Мы живем в эпоху API…
…вы запрашиваете данные и получаете их обратно…
Но как узнать, успешен ли ваш API-запрос?
Коды ответов HTTP могут сообщить вам, что, например, успешный запрос идентифицируется кодом 2xx.
Ответ 200 — это очень распространенный код ответа 2xx, который вы получаете, когда запрашиваете данные у API, и API успешно возвращает данные обратно.
В этом уроке я хочу показать вам, как можно использовать Bash и cURL для вызова API и подтверждения успешности вызова путем считывания кода ответа HTTP.
Для выполнения этого руководства вам понадобятся базовые знания командной строки Linux.
Что такое cURL?
Это инструмент для запроса данных с сервера или передачи данных на сервер с использованием нескольких протоколов, и интересующий нас протокол — HTTP (или HTTPS, если вы подключаетесь к API, защищенному SSL).
Команду cURL можно использовать в Linux разными способами (например, для загрузки файлов).
Мы будем использовать cURL для получения информации о погоде в Лондоне через Open Weather API.
Пример URL-адреса API, который мы хотим вызвать:
https://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=b6907d289e10d714a6e88b30761fae22
Давайте выполним команду cURL в терминале:
curl "https://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=b6907d289e10d714a6e88b30761fae22"
Ответ, который мы получаем по указанному URL, представлен в формате JSON:
{"coord":{"lon":-0.13,"lat":51.51},"weather":[{"id":300,"main":"Drizzle","description":"light intensity drizzle","icon":"09d"}],"base":"stations","main":{"temp":280.32,"pressure":1012,"humidity":81,"temp_min":279.15,"temp_max":281.15},"visibility":10000,"wind":{"speed":4.1,"deg":80},"clouds":{"all":90},"dt":1485789600,"sys":{"type":1,"id":5091,"message":0.0103,"country":"GB","sunrise":1485762037,"sunset":1485794875},"id":2643743,"name":"London","cod":200}
JSON (JavaScript Object Notation) наряду с XML является наиболее распространенным форматом данных, используемым API для обмена данными.
Как вы видите, ответ содержит данные о давлении, влажности, температуре и т. д.
Код ответа HTTP
Как я уже говорил, мы хотим понять, успешен ли вызов, выполненный через cURL.
Для этого нам необходимо проанализировать код HTTP-ответа, который мы получаем при отправке нашего запроса.
Какой синтаксис нам следует использовать?
Флаг cURL -–write-out
можно использовать для записи кода ответа HTTP в оболочку:
curl --write-out "%{http_code}\n" "https://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=b6907d289e10d714a6e88b30761fae22"
И ответ таков:
{"coord":{"lon":-0.13,"lat":51.51},"weather":[{"id":300,"main":"Drizzle","description":"light intensity drizzle","icon":"09d"}],"base":"stations","main":{"temp":280.32,"pressure":1012,"humidity":81,"temp_min":279.15,"temp_max":281.15},"visibility":10000,"wind":{"speed":4.1,"deg":80},"clouds":{"all":90},"dt":1485789600,"sys":{"type":1,"id":5091,"message":0.0103,"country":"GB","sunrise":1485762037,"sunset":1485794875},"id":2643743,"name":"London","cod":200}200
Вы можете видеть, что curl отображает код ответа HTTP в конце ответа, так что мы приближаемся к тому, что хотим.
Но как удалить данные JSON из ответа?
Мы можем использовать флаг –-output
, который позволяет записывать вывод команды cURL в файл вместо stdout. Давайте запишем вывод в файл с именем output.txt
curl --write-out "%{http_code}\n" "https://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=b6907d289e10d714a6e88b30761fae22" --output output.txt
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 459 0 459 0 0 2521 0 --:--:-- --:--:-- --:--:-- 2550
200
Намного лучше, но мы также видим подробности о скорости передачи, которые нас сейчас не интересуют.
А что, если мы хотим использовать флаг –-output
, чтобы не показывать ответ JSON, но в то же время не хотим создавать файл output.txt?
Как бы вы это сделали?
Последнее, чего мы хотим, — это не показывать отчет о передаче для cURL, который присутствовал в предыдущем выводе.
Для этого мы можем передать флаг –-silent
в командной строке (сохраните то же имя файла).
curl --write-out "%{http_code}\n" "https://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=b6907d289e10d714a6e88b30761fae22" --output output.txt --silent
200
И вуаля, мы только что получили код ответа HTTP.
Число 200 означает успешный запрос.
Альтернативой флагу –-silent
является короткая версия -s
. Также, если вы хотите узнать другие флаги, поддерживаемые curl, вы можете использовать флаг -h
.
curl -h
Использование cURL в скрипте Bash
Давайте напишем скрипт Bash с именем http_response.sh
, который записывает вывод команды cURL в переменную, а затем выводит значение переменной в оболочку:
#!/bin/bash
HTTP_CODE=$(curl --write-out "%{http_code}\n" "https://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=b6907d289e10d714a6e88b30761fae22" --output output.txt --silent)
echo $HTTP_CODE
При запуске скрипта мы получаем HTTP-код ответа:
localhost$./http_response.sh
200
Заключение
В этой статье вы узнали, как:
- Используйте команду cURL для извлечения данных из API (или из любого URL в целом)
- Распечатать код ответа HTTP
- Интегрируйте cURL в базовый скрипт Bash, который можно улучшить в соответствии с вашими требованиями.
Имеет ли это смысл?
Кроме того, если вы хотите автоматизировать множественные вызовы API через curl в скриптах оболочки Bash, вам придется использовать цикл while.
В то же время вам также будет полезно узнать о команде Bash sleep, которая позволяет контролировать количество вызовов, выполняемых к API за определенный период времени.