«1. Обзор

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

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

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. GET

Это метод по умолчанию при совершении 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. POST

Мы используем этот метод для отправки данных в службу-получатель, что означает, что мы используем параметр данных.

Самый простой способ сделать это — внедрить данные в команду:

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

Это также то, что браузеры использовать в простом POST. В нашем использовании мы обычно хотели бы настроить заголовки в зависимости от наших потребностей.

Например, если наша служба ожидает тип содержимого 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. PUT

Этот метод очень похож на 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

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

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

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

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

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

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

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

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

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

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

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

Служба, требующая аутентификации, отправит обратно код ответа 401 — Unauthorized HTTP и соответствующий заголовок 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.