Использование команды 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 за определенный период времени.

Written by Иван Васильков

Системный администратор и DevOps с опытом 10+ лет.