1. Обзор
В этом руководстве дается краткий обзор тестирования REST API с помощью curl.
curl - это инструмент командной строки для передачи данных, поддерживающий около 22 протоколов, включая HTTP. Эта комбинация делает его очень хорошим специальным инструментом для тестирования наших служб REST.
2. Параметры командной строки
curl поддерживает более 200 параметров командной строки . И у нас может быть ноль или более из них для сопровождения URL-адреса в команде.
Но прежде чем использовать его в наших целях, давайте взглянем на два, которые сделают нашу жизнь проще.
2.1. Подробный
Когда мы проводим тестирование, рекомендуется включить подробный режим:
curl -v //www.example.com/
В результате команды предоставят полезную информацию, такую как разрешенный IP-адрес, порт, к которому мы пытаемся подключиться, и заголовки.
2.2. Вывод
По умолчанию curl выводит тело ответа на стандартный вывод. При желании мы можем предоставить вариант вывода для сохранения в файл:
curl -o out.json //www.example.com/index.html
Это особенно полезно при большом размере ответа.
3. HTTP-методы с помощью Curl
Каждый HTTP-запрос содержит метод. Наиболее часто используемые методы - это GET, POST, PUT и DELETE.
3.1. ПОЛУЧИТЬ
Это метод по умолчанию при выполнении HTTP-вызовов с помощью curl. Фактически, показанные ранее примеры были простыми вызовами GET.
При запуске локального экземпляра службы на порту 8082 мы могли бы использовать что-то вроде этой команды для выполнения вызова GET:
curl -v //localhost:8082/spring-rest/foos/9
А поскольку у нас включен подробный режим, мы получим немного больше информации вместе с телом ответа:
* Trying ::1... * TCP_NODELAY set * Connected to localhost (::1) port 8082 (#0) > GET /spring-rest/foos/9 HTTP/1.1 > Host: localhost:8082 > User-Agent: curl/7.60.0 > Accept: */* >< HTTP/1.1 200 < X-Application-Context: application:8082 < Content-Type: application/json;charset=UTF-8 < Transfer-Encoding: chunked < Date: Sun, 15 Jul 2018 11:55:26 GMT < { "id" : 9, "name" : "TuwJ" }* Connection #0 to host localhost left intact
3.2. ПОСЛЕ
Мы используем этот метод для отправки данных в принимающую службу. И для этого мы используем опцию данных.
Самый простой способ сделать это - вставить данные в команду:
curl -d 'id=9&name=baeldung' //localhost:8082/spring-rest/foos/new
или передайте файл, содержащий тело запроса, в параметр данных следующим образом:
curl -d @request.json -H "Content-Type: application/json" //localhost:8082/spring-rest/foos/new
Используя приведенные выше команды как есть, мы можем столкнуться с сообщениями об ошибках, подобными следующему:
{ "timestamp" : "15-07-2018 05:57", "status" : 415, "error" : "Unsupported Media Type", "exception" : "org.springframework.web.HttpMediaTypeNotSupportedException", "message" : "Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported", "path" : "/spring-rest/foos/new" }
Это связано с тем, что curl добавляет следующий заголовок по умолчанию ко всем запросам POST:
Content-Type: application/x-www-form-urlencoded
Это также то, что браузеры используют в обычном POST. В нашем использовании мы обычно хотим настроить заголовки в зависимости от наших потребностей.
Например, если наша служба ожидает тип содержимого json, мы можем использовать параметр -H для изменения исходного запроса POST:
curl -d '{"id":9,"name":"baeldung"}' -H 'Content-Type: application/json' //localhost:8082/spring-rest/foos/new
Командная строка Windows не поддерживает одинарные кавычки, такие как оболочки, подобные Unix.
В результате нам пришлось бы заменить одинарные кавычки на двойные; избегая их там, где это необходимо:
curl -d "{\"id\":9,\"name\":\"baeldung\"}" -H "Content-Type: application/json" //localhost:8082/spring-rest/foos/new
Кроме того, когда мы хотим отправить несколько больший объем данных, обычно рекомендуется использовать файл данных.
3.3. ПОЛОЖИТЬ
Этот метод очень похож на POST. Но мы используем его, когда хотим отправить новую версию существующего ресурса. Для этого мы используем параметр -X.
Без упоминания типа метода запроса curl по умолчанию использует GET. Поэтому мы явно указываем тип метода в случае PUT:
curl -d @request.json -H 'Content-Type: application/json' -X PUT //localhost:8082/spring-rest/foos/9
3.4. УДАЛЯТЬ
Опять же, мы указываем, что хотим использовать DELETE, используя параметр -X:
curl -X DELETE //localhost:8082/spring-rest/foos/9
4. Пользовательские заголовки
Мы можем заменить заголовки по умолчанию или добавить свои собственные.
Например, чтобы изменить заголовок Host, мы делаем это:
curl -H "Host: com.baeldung" //example.com/
Чтобы отключить заголовок User-Agent, мы указываем пустое значение:
curl -H "User-Agent:" //example.com/
Самый обычный сценарий при тестировании - это изменение заголовков Content-Type и Accept. Нам просто нужно было бы добавить к каждому заголовку префикс -H:
curl -d @request.json -H "Content-Type: application/json" -H "Accept: application/json" //localhost:8082/spring-rest/foos/new
5. Аутентификация
Служба, требующая аутентификации, отправит обратно код ответа 401 - Unauthorized HTTP и связанный заголовок WWW-Authenticate.
Для базовой аутентификации мы можем просто встроить комбинацию имени пользователя и пароля в наш запрос, используя опцию user :
curl --user baeldung:secretPassword //example.com/
Однако, если мы хотим использовать OAuth2 для аутентификации, нам сначала нужно получить access_token из нашей службы авторизации.
Ответ службы будет содержать access_token:
{ "access_token": "b1094abc0-54a4-3eab-7213-877142c33fh3", "token_type": "bearer", "refresh_token": "253begef-868c-5d48-92e8-448c2ec4bd91", "expires_in": 31234 }
Теперь мы можем использовать токен в заголовке авторизации:
curl -H "Authorization: Bearer b1094abc0-54a4-3eab-7213-877142c33fh3" //example.com/
6. Заключение
Мы рассмотрели использование минимальной функциональности curl для тестирования наших служб REST. Хотя он может гораздо больше, чем то, что здесь обсуждалось, для нашей цели этого должно хватить.
Не стесняйтесь набирать curl -h в командной строке, чтобы проверить все доступные параметры. Служба REST, используемая для демонстрации, доступна здесь, на GitHub.