1. Обзор
Unirest – это облегченная клиентская библиотека HTTP от Mashape. Наряду с Java, он также доступен для Node.js, .Net, Python, Ruby и т. Д.
Прежде чем мы начнем, обратите внимание, что мы будем использовать mocky.io для всех наших HTTP-запросов здесь.
2. Настройка Maven
Для начала давайте сначала добавим необходимые зависимости:
com.mashape.unirest unirest-java 1.4.9
Ознакомьтесь с последней версией здесь .
3. Простые запросы
Давайте отправим простой HTTP-запрос, чтобы понять семантику фреймворка:
@Test public void shouldReturnStatusOkay() { HttpResponsejsonResponse = Unirest.get("http://www.mocky.io/v2/5a9ce37b3100004f00ab5154") .header("accept", "application/json").queryString("apiKey", "123") .asJson(); assertNotNull(jsonResponse.getBody()); assertEquals(200, jsonResponse.getStatus()); }
Обратите внимание, что API свободно, эффективно и довольно легко читается.
Мы передаем заголовки и параметры с помощью API header() и fields () .
И запрос вызывается при вызове метода asJson () ; у нас также есть другие варианты здесь, такие как as Binary(), as String() и asObject().
Чтобы передать несколько заголовков или полей, мы можем создать карту и передать их в .headers(Map Object> headers) и .fields(Map String> fields) соответственно: Object> headers)
@Test public void shouldReturnStatusAccepted() { Mapheaders = new HashMap<>(); headers.put("accept", "application/json"); headers.put("Authorization", "Bearer 5a9ce37b3100004f00ab5154"); Map fields = new HashMap<>(); fields.put("name", "Sam Baeldung"); fields.put("id", "PSP123"); HttpResponse jsonResponse = Unirest.put("http://www.mocky.io/v2/5a9ce7853100002a00ab515e") .headers(headers).fields(fields) .asJson(); assertNotNull(jsonResponse.getBody()); assertEquals(202, jsonResponse.getStatus()); }
3.1. Передача Параметров Запроса
Чтобы передать данные в виде запроса String, мы будем использовать метод queryString() :
HttpResponsejsonResponse = Unirest.get("http://www.mocky.io/v2/5a9ce37b3100004f00ab5154") .queryString("apiKey", "123")
3.2. Использование Параметров Пути
Для передачи любых параметров URL-адреса мы можем использовать метод route Param() :
HttpResponsejsonResponse = Unirest.get("http://www.mocky.io/v2/5a9ce37b3100004f00ab5154/{userId}") .routeParam("userId", "123")
Имя заполнителя параметра должно совпадать с первым аргументом метода.
3.3. Запросы С Телом
Если для нашего запроса требуется тело строки/JSON, мы передаем его с помощью метода body() :
@Test public void givenRequestBodyWhenCreatedThenCorrect() { HttpResponsejsonResponse = Unirest.post("http://www.mocky.io/v2/5a9ce7663100006800ab515d") .body("{\"name\":\"Sam Baeldung\", \"city\":\"viena\"}") .asJson(); assertEquals(201, jsonResponse.getStatus()); }
3.4. Картограф объектов
Чтобы использовать их в качестве объекта() или тела() в запросе, нам нужно определить наш картограф объектов. Для простоты мы будем использовать картограф объектов Джексона.
Давайте сначала добавим следующие зависимости в pom.xml :
com.fasterxml.jackson.core jackson-databind 2.9.4
Всегда используйте последнюю версию поверх на Maven Central .
Теперь давайте настроим наш картограф:
Unirest.setObjectMapper(new ObjectMapper() { com.fasterxml.jackson.databind.ObjectMapper mapper = new com.fasterxml.jackson.databind.ObjectMapper(); public String writeValue(Object value) { return mapper.writeValueAsString(value); } publicT readValue(String value, Class valueType) { return mapper.readValue(value, valueType); } });
Обратите внимание, что setObjectMapper() должен вызываться только один раз для настройки картографа; как только экземпляр картографа будет установлен, он будет использоваться для всех запросов и ответов.
Теперь давайте протестируем новую функциональность с помощью пользовательского объекта Article :
@Test public void givenArticleWhenCreatedThenCorrect() { Article article = new Article("ID1213", "Guide to Rest", "baeldung"); HttpResponsejsonResponse = Unirest.post("http://www.mocky.io/v2/5a9ce7663100006800ab515d") .body(article) .asJson(); assertEquals(201, jsonResponse.getStatus()); }
4. Методы запроса
Как и любой HTTP-клиент, платформа предоставляет отдельные методы для каждого HTTP-глагола:
ПОСТ:
Unirest.post("http://www.mocky.io/v2/5a9ce7663100006800ab515d")
КЛАСТЬ:
Unirest.put("http://www.mocky.io/v2/5a9ce7663100006800ab515d")
ПОЛУЧИТЬ:
Unirest.get("http://www.mocky.io/v2/5a9ce7663100006800ab515d")
УДАЛИТЬ:
Unirest.delete("http://www.mocky.io/v2/5a9ce7663100006800ab515d")
ЗАПЛАТКА:
Unirest.patch("http://www.mocky.io/v2/5a9ce7663100006800ab515d")
ОПЦИИ:
Unirest.options("http://www.mocky.io/v2/5a9ce7663100006800ab515d")
5. Методы реагирования
Как только мы получим ответ, давайте проверим код состояния и сообщение о состоянии:
//... jsonResponse.getStatus() //...
Извлеките заголовки:
//... jsonResponse.getHeaders(); //...
Получить тело ответа:
//... jsonResponse.getBody(); jsonResponse.getRawBody(); //...
Обратите внимание, что getRawBody(), возвращает поток нерассмотренного тела ответа, в то время как getBody() возвращает проанализированное тело, используя сопоставитель объектов, определенный в предыдущем разделе.
6. Обработка Асинхронных Запросов
Unirest также имеет возможность обрабатывать асинхронные запросы с помощью java.util.concurrent.Будущее и методы обратного вызова:
@Test public void whenAysncRequestShouldReturnOk() { Future> future = Unirest.post( "http://www.mocky.io/v2/5a9ce37b3100004f00ab5154?mocky-delay=10000ms") .header("accept", "application/json") .asJsonAsync(new Callback () { public void failed(UnirestException e) { // Do something if the request failed } public void completed(HttpResponse response) { // Do something if the request is successful } public void cancelled() { // Do something if the request is cancelled } }); assertEquals(200, future.get().getStatus()); }
com.mashape.unirest.http.async.Обратный вызов интерфейс предоставляет три метода: failed() , cancelled() и completed().
Переопределите методы для выполнения необходимых операций в зависимости от ответа.
7. Загрузка файлов
Чтобы загрузить или отправить файл как часть запроса, передайте java.io.Файл объект в виде поля с именем file:
@Test public void givenFileWhenUploadedThenCorrect() { HttpResponsejsonResponse = Unirest.post( "http://www.mocky.io/v2/5a9ce7663100006800ab515d") .field("file", new File("/path/to/file")) .asJson(); assertEquals(201, jsonResponse.getStatus()); }
Мы также можем использовать Байтовый поток:
@Test public void givenByteStreamWhenUploadedThenCorrect() { try (InputStream inputStream = new FileInputStream( new File("/path/to/file/artcile.txt"))) { byte[] bytes = new byte[inputStream.available()]; inputStream.read(bytes); HttpResponsejsonResponse = Unirest.post( "http://www.mocky.io/v2/5a9ce7663100006800ab515d") .field("file", bytes, "article.txt") .asJson(); assertEquals(201, jsonResponse.getStatus()); } }
Или используйте входной поток напрямую, добавив тип содержимого .APPLICATION_OCTET_STREAM в качестве второго аргумента в методе fields() :
@Test public void givenInputStreamWhenUploadedThenCorrect() { try (InputStream inputStream = new FileInputStream( new File("/path/to/file/artcile.txt"))) { HttpResponsejsonResponse = Unirest.post( "http://www.mocky.io/v2/5a9ce7663100006800ab515d") .field("file", inputStream, ContentType.APPLICATION_OCTET_STREAM, "article.txt").asJson(); assertEquals(201, jsonResponse.getStatus()); } }
8. Конфигурации Unirest
Фреймворк также поддерживает типичные конфигурации HTTP-клиента, такие как пул соединений, тайм-ауты, глобальные заголовки и т. Д.
Давайте установим количество соединений и максимальное количество соединений на маршрут:
Unirest.setConcurrency(20, 5);
Настройка таймаутов подключения и сокета:
Unirest.setTimeouts(20000, 15000);
Обратите внимание, что значения времени указаны в миллисекундах.
Теперь давайте установим заголовки HTTP для всех наших запросов:
Unirest.setDefaultHeader("X-app-name", "baeldung-unirest"); Unirest.setDefaultHeader("X-request-id", "100004f00ab5");
Мы можем очистить глобальные заголовки в любое время:
Unirest.clearDefaultHeaders();
В какой-то момент нам может потребоваться сделать запросы через прокси-сервер:
Unirest.setProxy(new HttpHost("localhost", 8080));
Одним из важных аспектов, о котором следует помнить, является изящное закрытие или выход из приложения. Это порождает цикл фоновых событий для обработки операций, нам нужно закрыть этот цикл перед выходом из нашего приложения:
Unirest.shutdown();
9. Заключение
В этом уроке мы сосредоточились на облегченной клиентской платформе HTTP – Unirest. Мы работали с несколькими простыми примерами, как в синхронном, так и в асинхронном режимах.
Наконец, мы также использовали несколько расширенных конфигураций, таких как пул соединений, настройки прокси-сервера и т. Д.
Как обычно, исходный код доступен на GitHub .