Руководство по Unirest

Руководство по 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.