Рубрики
Без рубрики

Протестируйте REST API с помощью curl

Узнайте, как протестировать HTTP GET, POST, PUT и DELETE с помощью curl

Автор оригинала: baeldung.

1. Обзор

В этом руководстве дается краткий обзор тестирования REST API с использованием curl.

curl -это инструмент командной строки для передачи данных, и он поддерживает около 22 протоколов, включая HTTP. Эта комбинация делает его очень хорошим специальным инструментом для тестирования наших сервисов REST.

Дальнейшее чтение:

Тестирование веб-API с коллекциями почтальонов

Руководство по спокойному отдыху

2. Параметры командной строки

curl поддерживает более 200 параметров командной строки . Мы можем иметь ноль или более из них, чтобы сопровождать URL-адрес в команде.

Прежде чем использовать его в наших целях, давайте рассмотрим два варианта, которые облегчат нам жизнь.

2.1. Многословный

Когда мы проводим тестирование, рекомендуется включить режим подробного изложения:

curl -v http://www.example.com/

В результате команды предоставляют полезную информацию, такую как разрешенный IP-адрес, порт, к которому мы пытаемся подключиться, и заголовки.

2.2. Выходные данные

По умолчанию curl выводит тело ответа на стандартный вывод. Кроме того, мы можем предоставить опцию вывода для сохранения в файл:

curl -o out.json http://www.example.com/index.html

Это особенно полезно, когда размер ответа большой.

3. Методы HTTP С curl

Каждый HTTP-запрос содержит метод. Наиболее часто используемые методы-GET, POST, PUT и DELETE.

3.1. ПОЛУЧИТЬ

Это метод по умолчанию при выполнении HTTP-вызовов с помощью curl . На самом деле, ранее показанные примеры были обычными вызовами GET.

При запуске локального экземпляра службы в порту 8082 мы использовали бы что-то вроде этой команды для вызова GET:

curl -v http://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' http://localhost:8082/spring-rest/foos/new

В качестве альтернативы мы можем передать файл, содержащий тело запроса, в опцию данных следующим образом:

curl -d @request.json -H "Content-Type: application/json" 
  http://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

Это также то, что браузеры используют в обычном СООБЩЕНИИ. В нашем использовании мы обычно хотим настроить заголовки в зависимости от ваших потребностей.

Например, если наша служба ожидает тип содержимого JSON, мы можем использовать опцию-H для изменения исходного запроса POST:

curl -d '{"id":9,"name":"baeldung"}' -H 'Content-Type: application/json' 
  http://localhost:8082/spring-rest/foos/new

Командная строка Windows не поддерживает одинарные кавычки, как в Unix-подобных оболочках.

В результате нам придется заменить одинарные кавычки двойными, хотя мы стараемся избегать их везде, где это необходимо:

curl -d "{\"id\":9,\"name\":\"baeldung\"}" -H "Content-Type: application/json" 
  http://localhost:8082/spring-rest/foos/new

Кроме того, когда мы хотим отправить несколько больший объем данных, обычно рекомендуется использовать файл данных.

3.3. ПОСТАВИТЬ

Этот метод очень похож на POST, но мы используем его, когда хотим отправить новую версию существующего ресурса. Для этого мы используем опцию-X.

Без какого-либо упоминания типа метода запроса, curl по умолчанию использует GET; поэтому мы явно упоминаем тип метода в случае PUT:

curl -d @request.json -H 'Content-Type: application/json' 
  -X PUT http://localhost:8082/spring-rest/foos/9

3.4. ИСКЛЮЧИТЬ

Опять же, мы указываем, что хотим использовать DELETE, используя опцию-X:

curl -X DELETE http://localhost:8082/spring-rest/foos/9

4. Пользовательские заголовки

Мы можем заменить заголовки по умолчанию или добавить собственные заголовки.

Например, чтобы изменить заголовок хоста, мы делаем это:

curl -H "Host: com.baeldung" http://example.com/

Чтобы отключить заголовок агента пользователя, мы вводим пустое значение:

curl -H "User-Agent:" http://example.com/

Наиболее распространенным сценарием при тестировании является изменение типа содержимого и заголовка Accept. Нам просто нужно префиксировать каждый заголовок параметром-H:

curl -d @request.json -H "Content-Type: application/json" 
  -H "Accept: application/json" http://localhost:8082/spring-rest/foos/new

5. Аутентификация

Служба, требующая проверки подлинности, отправит обратно неавторизованный код ответа HTTP 401 и соответствующий заголовок WWW – Authenticate.

Для базовой аутентификации мы можем просто встроить комбинацию имени пользователя и пароля в наш запрос, используя опцию пользователя :

curl --user baeldung:secretPassword http://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" http://example.com/

6. Заключение

В этой статье мы продемонстрировали использование минимальной функциональности curl для тестирования наших служб REST. Хотя он может сделать гораздо больше, чем то, что обсуждалось здесь, для наших целей этого должно быть достаточно.

Не стесняйтесь вводить curl -h в командной строке, чтобы проверить все доступные параметры. Сервис REST, используемый для демонстрации, доступен здесь, на GitHub .