Руководство по Unirest
1. обзор
Unirest - это легковесная клиентская библиотека HTTP от Mashape. Наряду с Java он также доступен для Node.js, .Net, Python, Ruby и т. Д.
Прежде чем мы начнем, обратите внимание, что здесь мы будем использоватьmocky.io для всех наших HTTP-запросов.
2. Maven Setup
Для начала давайте сначала добавим необходимые зависимости:
com.mashape.unirest
unirest-java
1.4.9
Проверьте последнюю версиюhere.
3. Простые запросы
Давайте отправим простой HTTP-запрос, чтобы понять семантику фреймворка:
@Test
public void shouldReturnStatusOkay() {
HttpResponse jsonResponse
= Unirest.get("http://www.mocky.io/v2/5a9ce37b3100004f00ab5154")
.header("accept", "application/json").queryString("apiKey", "123")
.asJson();
assertNotNull(jsonResponse.getBody());
assertEquals(200, jsonResponse.getStatus());
}
Обратите внимание, что API свободно, эффективно и легко читается.
Мы передаем заголовки и параметры с помощью APIheader() иfields().
И запрос вызывается при вызове методаasJson(); у нас также есть другие варианты, такие какasBinary(), asString() иasObject().
Чтобы передать несколько заголовков или полей, мы можем создать карту и передать их.headers(Map<String, Object> headers) и.fields(Map<String, String> fields) соответственно:
@Test
public void shouldReturnStatusAccepted() {
Map headers = new HashMap<>();
headers.put("accept", "application/json");
headers.put("Authorization", "Bearer 5a9ce37b3100004f00ab5154");
Map fields = new HashMap<>();
fields.put("name", "Sam example");
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():
HttpResponse jsonResponse
= Unirest.get("http://www.mocky.io/v2/5a9ce37b3100004f00ab5154")
.queryString("apiKey", "123")
3.2. Использование параметров пути
Для передачи любых параметров URL мы можем использовать методrouteParam():
HttpResponse jsonResponse
= Unirest.get("http://www.mocky.io/v2/5a9ce37b3100004f00ab5154/{userId}")
.routeParam("userId", "123")
Имя заполнителя параметра должно совпадать с первым аргументом метода.
3.3. Запросы с телом
Если нашему запросу требуется строка / тело JSON, мы передаем его с помощью методаbody():
@Test
public void givenRequestBodyWhenCreatedThenCorrect() {
HttpResponse jsonResponse
= Unirest.post("http://www.mocky.io/v2/5a9ce7663100006800ab515d")
.body("{\"name\":\"Sam example\", \"city\":\"viena\"}")
.asJson();
assertEquals(201, jsonResponse.getStatus());
}
3.4. Object Mapper
Чтобы использоватьasObject() илиbody() в запросе, нам нужно определить наш объектный сопоставитель. Для простоты мы будем использовать средство отображения объектов Джексона.
Давайте сначала добавим кpom.xml следующие зависимости:
com.fasterxml.jackson.core
jackson-databind
2.9.4
Всегда используйте последнюю версию болееon 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);
}
public T readValue(String value, Class valueType) {
return mapper.readValue(value, valueType);
}
});
Обратите внимание, чтоsetObjectMapper() следует вызывать только один раз, для настройки сопоставителя; как только экземпляр сопоставителя установлен, он будет использоваться для всех запросов и ответов.
Давайте теперь протестируем новую функциональность с помощью настраиваемого объектаArticle:
@Test
public void givenArticleWhenCreatedThenCorrect() {
Article article
= new Article("ID1213", "Guide to Rest", "example");
HttpResponse jsonResponse
= 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")
PUT:
Unirest.put("http://www.mocky.io/v2/5a9ce7663100006800ab515d")
GET:
Unirest.get("http://www.mocky.io/v2/5a9ce7663100006800ab515d")
УДАЛЯТЬ:
Unirest.delete("http://www.mocky.io/v2/5a9ce7663100006800ab515d")
PATCH:
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.Future и методы обратного вызова:
@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.Callback<T> предоставляет три метода:failed(),cancelled() иcompleted()..
Переопределите методы для выполнения необходимых операций в зависимости от ответа.
7. Загрузка файлов
Чтобы загрузить или отправить файл как часть запроса, передайте объектjava.io.File как поле с именем file:
@Test
public void givenFileWhenUploadedThenCorrect() {
HttpResponse jsonResponse = Unirest.post(
"http://www.mocky.io/v2/5a9ce7663100006800ab515d")
.field("file", new File("/path/to/file"))
.asJson();
assertEquals(201, jsonResponse.getStatus());
}
Мы также можем использоватьByteStream:
@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);
HttpResponse jsonResponse = Unirest.post(
"http://www.mocky.io/v2/5a9ce7663100006800ab515d")
.field("file", bytes, "article.txt")
.asJson();
assertEquals(201, jsonResponse.getStatus());
}
}
Или используйте входной поток напрямую, добавивContentType.APPLICATION_OCTET_STREAM в качестве второго аргумента в методеfields():
@Test
public void givenInputStreamWhenUploadedThenCorrect() {
try (InputStream inputStream = new FileInputStream(
new File("/path/to/file/artcile.txt"))) {
HttpResponse jsonResponse = 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", "example-unirest");
Unirest.setDefaultHeader("X-request-id", "100004f00ab5");
Мы можем очистить глобальные заголовки в любое время:
Unirest.clearDefaultHeaders();
В какой-то момент нам может потребоваться сделать запросы через прокси-сервер:
Unirest.setProxy(new HttpHost("localhost", 8080));
Один важный аспект, о котором следует помнить, - это корректное закрытие или выход из приложения. Unirest порождает цикл фоновых событий для обработки операций, нам нужно отключить этот цикл перед выходом из нашего приложения:
Unirest.shutdown();
9. Заключение
В этом уроке мы сосредоточились на облегченной клиентской среде HTTP - Unirest. Мы работали с несколькими простыми примерами, как в синхронном, так и в асинхронном режимах.
Наконец, мы также использовали несколько расширенных конфигураций - таких как пул соединений, настройки прокси и т. Д.
Как обычно доступен исходный кодover on GitHub.