Наш пример API прогноза погоды не позволяет использовать что-либо, кроме метода GET, поэтому для этого упражнения, чтобы использовать другие методы с curl, мы будем использовать API-интерфейс petstore. На самом деле мы не будем использовать интерфейс Swagger (о чем мы поговорим позже), на данный момент нам просто нужен API, с помощью которого мы можем создавать, обновлять и удалять контент.
В этом примере с помощью Petstore API мы создадим нового питомца, обновим его, получим id питомца, удалим его, а затем попытаемся получить удаленного питомца.
Получение имени питомца при помощи ID
Для создания своего питомца, мы должны передать сообщение в формате JSON в теле запроса. Вместо того, чтобы пытаться кодировать JSON и передавать его в URL, мы сохраним JSON в файле и будем ссылаться на него.
Многие API требуют публикации запросов, содержащих сообщения JSON в теле. Параметры тела запроса часто зависят от настроек вашего сервиса. Список пар ключ-значение JSON, которые принимает API, называется «Модель» на дисплее интерфейса Swagger.
- Создаем текстовый файл и пишем в нем следующий код (эта информация будет передана в параметре
-d
curl запроса):
{
"id": 123,
"category": {
"id": 123,
"name": "test"
},
"name": "fluffy",
"photoUrls": [
"string"
],
"tags": [
{
"id": 0,
"name": "string"
}
],
"status": "available"
}
- Изменим значение в первом id и поменяем кличку с "fluffy" на какое-нибудь другое
Лучше использовать уникальный id и такую кличку, которую вряд ли кто придумает. Также не стоит начинать id с "0".
-
Сохраняем наш файл в формате .json в каталоге, к которому можно легко получить доступ с терминала, например, в пользовательском каталоге (на Mac, Users / YOURUSERNAME - заменяем YOURUSERNAME реальным именем пользователя на вашем компьютере).
-
В Терминале /командной строке переходим в каталог с сохраненным файлом.
Для перехода по каталогам:
- На MacOS находим свой текущий рабочий каталог, набрав
pwd
. Переход на уровень выше при помощи командыcd ../
. Переход на уровень ниже при помощи командыcd pets
, гдеpets
- это имя каталога, в который нужно попасть. Вводимls
, чтобы просмотреть содержимое каталога. - На Windows смотрим в строку пути, чтобы понять в какой директории находимся. Переход на уровень выше при помощи команды
cd ../
. Переход на уровень ниже при помощи командыcd pets
, гдеpets
- это имя каталога, в который нужно попасть. Вводимdir
чтобы посмотреть список директорий в текущей директории.
- После того, как вы перешли в Терминале/командной строке в каталог с сохраненным JSON файлом, создаем нашего питомца следующим curl запросом:
curl -X POST --header "Content-Type: application/json" --header "Accept: application/json" -d @mypet.json "http://petstore.swagger.io/v2/pet"
Content-Type
указывает тип контента, представленного в теле запроса. Accept
указывает тип контента, который мы примем в ответе.
Ответ будет выглядеть примерно так:
{"id":891654,"category":{"id":4,"name":"testexecution"},"name":"SpeedDemon","photoUrls":["string"],"tags":[{"id":0,"name":"string"}],"status":"available"}
Проверьте, что в ответе кличка именно вашего питомца.
Не стесняйтесь выполнить этот же запрос несколько раз. REST API являются «идемпотентными», что означает, что выполнение одного и того же запроса более одного раза не приведет к дублированию результатов (мы просто создаем одного питомца, а не нескольких питомцев). Тодд Фредрих объясняет идемпотентность, сравнивая ее с беременной коровой. Допустим, вы привели быка, чтобы забеременеть. Даже если бык и корова спариваются несколько раз, результатом будет всего одна беременность, а не беременность для каждого сеанса спаривания.
А что если питомец не любит свое имя?
Изменим ему имя на другое используя метод обновления.
-
В файле .json сданными питомца изменим его имя/
-
Вместо метода POST используем метод PUT для обновления имени (в остальном запрос не меняется):
curl -X PUT --header "Content-Type: application/json" --header "Accept: application/json" -d @mypet.json "http://petstore.swagger.io/v2/pet"
В ответе будет новое имя питомца.
Теперь узнаем имя питомца, передав его ID в конечную точку /pet/{petID}:
-
В файле .json скопируем значение id питомца.
-
В команде curl заменим
51231236
на id своего питомца и узнаем информацию о нем:
curl -X GET --header "Accept: application/json" "http://petstore.swagger.io/v2/pet/51231236"
В ответе будет информация о нашем питомце:
{"id":891654,"category":{"id":123,"name":"test"},"name":"Beatle","photoUrls":["string"],"tags":[{"id":0,"name":"string"}],"status":"available"}
Можно отформатировать JSON, вставив его в инструмент форматирования JSON
{
"id": 891654,
"category": {
"id": 123,
"name": "test"
},
"name": "Beatle",
"photoUrls": [
"string"
],
"tags": [
{
"id": 0,
"name": "string"
}
],
"status": "available"
}
"Извини, сынок, собака была бешеной, пришлось пристрелить" (© "Маска" фильм, 1994)
- Для удаления питомца используем метод DELETE. В примере ниже меняем
5123123
на id своего питомца:
curl -X DELETE --header "Accept: application/json" "http://petstore.swagger.io/v2/pet/891654"
Теперь проверим, получилось удалить питомца. Используем метод GET в этой же команде
curl -X GET --header "Accept: application/json" "http://petstore.swagger.io/v2/pet/891654"
Ответ будет примерно таким:
{"code":1,"type":"error","message":"Pet not found"}
Этот пример позволил нам увидеть, как можно работать с curl для создания, чтения, обновления и удаления ресурсов. Эти четыре операции называются CRUD
и являются общими почти для каждого языка программирования.
Хотя Postman, вероятно, проще в использовании, curl используется на уровне мощности. Команды тестирования часто создают сложные тестовые сценарии, которые повторяют множество запросов curl.
Можно импортировать команды curl в Postman выполняя следующее:
-
Открываем новую вкладку в Postman и нажимаем
Import
в левом верхнем углу. -
В диалоговом окне выбираем вкладку "Paste Raw Text" и вводим команду:
curl -X GET --header "Accept: application/json" "http://petstore.swagger.io/v2/pet/891654"
Указываем свой Id питомца и проверяем, что нет лишних пробелов.
-
Нажимаем на кнопку
Import
-
Закрываем диалоговое окно, если не закрылось автоматически.
-
Нажимаем кнопку
Send
(Если питомец был удален, то будет выдана ошибка "Pet not found")
Можно экспортировать Postman в curl, выполнив следующие действия:
-
При желании выбираем один из наших запросов API OpenWeatherMap в Postman.
-
Нажимаем кнопку
Code
-
Выбираем
curl
в выпадающем списке. -
Копируем отрывок кода
curl -X GET \
'https://api.openweathermap.org/data/2.5/weather?lat=37.3565982&lon=-121.9689848&units=imperial&appid=fd4698c940c6d1da602a70ac34f0b147' \
-H 'Postman-Token: de0da6b7-1dbc-44d6-acc1-9741f05a7bf1' \
-H 'cache-control: no-cache'
Вы можете видеть, что Postman добавляет дополнительную информацию заголовка (-H 'Postman-Token: de0da6b7-1dbc-44d6-acc1-9741f05a7bf1' \ -H 'cache-control: no-cache'
) в запрос. Эта дополнительная информация заголовка не нужна и может быть удалена.
-
Удаляем обратный слэш и разрывы строк. На Windows еще меняем одинарные кавычки на двойные.
-
Вставляем команду curl в терминал и смотрим результат.
curl -X GET "https://api.openweathermap.org/data/2.5/weather?lat=37.3565982&lon=-121.9689848&units=imperial&appid=fd4698c940c6d1da602a70ac34f0b147"
Благодаря функциям импорта и кода Postman можно легко переключаться между Postman и curl.