Una guía para el malestar

1. Información general

Unirest es una biblioteca cliente HTTP ligera de Mashape. Junto con Java, también está disponible para Node.js, .Net, Python, Ruby, etc.

Antes de saltar, tenga en cuenta que usaremos mocky.io para todas nuestras solicitudes HTTP aquí.

2. Configuración de Maven

Para comenzar, primero agreguemos las dependencias necesarias:

 com.mashape.unirest unirest-java 1.4.9 

Consulte la última versión aquí.

3. Solicitudes simples

Enviemos una solicitud HTTP simple, para comprender la semántica del marco:

@Test public void shouldReturnStatusOkay() { HttpResponse jsonResponse = Unirest.get("//www.mocky.io/v2/5a9ce37b3100004f00ab5154") .header("accept", "application/json").queryString("apiKey", "123") .asJson(); assertNotNull(jsonResponse.getBody()); assertEquals(200, jsonResponse.getStatus()); }

Tenga en cuenta que la API es fluida, eficiente y bastante fácil de leer.

Estamos pasando encabezados y parámetros con las API de encabezado () y campos () .

Y la solicitud se invoca en la llamada al método asJson () ; también tenemos otras opciones aquí, como asBinary (), asString () y asObject ().

Para pasar varios encabezados o campos, podemos crear un mapa y pasarlos a .headers (encabezados del mapa) y .fields (campos del mapa) respectivamente:

@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 Baeldung"); fields.put("id", "PSP123"); HttpResponse jsonResponse = Unirest.put("//www.mocky.io/v2/5a9ce7853100002a00ab515e") .headers(headers).fields(fields) .asJson(); assertNotNull(jsonResponse.getBody()); assertEquals(202, jsonResponse.getStatus()); }

3.1. Pasar parámetros de consulta

Para pasar datos como una cadena de consulta , usaremos el método queryString () :

HttpResponse jsonResponse = Unirest.get("//www.mocky.io/v2/5a9ce37b3100004f00ab5154") .queryString("apiKey", "123")

3.2. Usar parámetros de ruta

Para pasar cualquier parámetro de URL, podemos usar el método routeParam () :

HttpResponse jsonResponse = Unirest.get("//www.mocky.io/v2/5a9ce37b3100004f00ab5154/{userId}") .routeParam("userId", "123")

El nombre del marcador de posición del parámetro debe ser el mismo que el del primer argumento del método.

3.3. Solicitudes con cuerpo

Si nuestra solicitud requiere un cuerpo de cadena / JSON, lo pasamos usando el método body () :

@Test public void givenRequestBodyWhenCreatedThenCorrect() { HttpResponse jsonResponse = Unirest.post("//www.mocky.io/v2/5a9ce7663100006800ab515d") .body("{\"name\":\"Sam Baeldung\", \"city\":\"viena\"}") .asJson(); assertEquals(201, jsonResponse.getStatus()); }

3.4. Mapeador de objetos

Para usar asObject () o body () en la solicitud, necesitamos definir nuestro mapeador de objetos. Para simplificar, usaremos el mapeador de objetos Jackson.

Primero agreguemos las siguientes dependencias a pom.xml :

 com.fasterxml.jackson.core jackson-databind 2.9.4 

Utilice siempre la última versión en Maven Central.

Ahora configuremos nuestro mapeador:

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); } });

Tenga en cuenta que setObjectMapper () solo debe llamarse una vez, para configurar el asignador; Una vez que se establece la instancia del asignador, se utilizará para todas las solicitudes y respuestas.

Probemos ahora la nueva funcionalidad usando un objeto Artículo personalizado :

@Test public void givenArticleWhenCreatedThenCorrect() { Article article = new Article("ID1213", "Guide to Rest", "baeldung"); HttpResponse jsonResponse = Unirest.post("//www.mocky.io/v2/5a9ce7663100006800ab515d") .body(article) .asJson(); assertEquals(201, jsonResponse.getStatus()); }

4. Métodos de solicitud

Similar a cualquier cliente HTTP, el marco proporciona métodos separados para cada verbo HTTP:

ENVIAR:

Unirest.post("//www.mocky.io/v2/5a9ce7663100006800ab515d")

PONER:

Unirest.put("//www.mocky.io/v2/5a9ce7663100006800ab515d")

OBTENER:

Unirest.get("//www.mocky.io/v2/5a9ce7663100006800ab515d")

ELIMINAR:

Unirest.delete("//www.mocky.io/v2/5a9ce7663100006800ab515d")

PARCHE:

Unirest.patch("//www.mocky.io/v2/5a9ce7663100006800ab515d")

OPCIONES:

Unirest.options("//www.mocky.io/v2/5a9ce7663100006800ab515d")

5. Métodos de respuesta

Una vez que obtengamos la respuesta, verifiquemos el código de estado y el mensaje de estado:

//... jsonResponse.getStatus() //...

Extrae los encabezados:

//... jsonResponse.getHeaders(); //...

Obtenga el cuerpo de respuesta:

//... jsonResponse.getBody(); jsonResponse.getRawBody(); //...

Observe que, getRawBody (), devuelve un flujo del cuerpo de respuesta sin analizar, mientras que getBody () devuelve el cuerpo analizado, utilizando el asignador de objetos definido en la sección anterior.

6. Manejo de solicitudes asincrónicas

Unirest también tiene la capacidad de manejar solicitudes asincrónicas, utilizando los métodos java.util.concurrent.Future y callback:

@Test public void whenAysncRequestShouldReturnOk() { Future
    
      future = Unirest.post( "//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()); }
    

The com.mashape.unirest.http.async.Callback interface provides three methods, failed(), cancelled() and completed().

Override the methods to perform the necessary operations depending on the response.

7. File Uploads

To upload or send a file as a part of the request, pass a java.io.File object as a field with name file:

@Test public void givenFileWhenUploadedThenCorrect() { HttpResponse jsonResponse = Unirest.post( "//www.mocky.io/v2/5a9ce7663100006800ab515d") .field("file", new File("/path/to/file")) .asJson(); assertEquals(201, jsonResponse.getStatus()); }

We can also use 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( "//www.mocky.io/v2/5a9ce7663100006800ab515d") .field("file", bytes, "article.txt") .asJson(); assertEquals(201, jsonResponse.getStatus()); } }

Or use the input stream directly, adding the ContentType.APPLICATION_OCTET_STREAM as the second argument in the fields() method:

@Test public void givenInputStreamWhenUploadedThenCorrect() { try (InputStream inputStream = new FileInputStream( new File("/path/to/file/artcile.txt"))) { HttpResponse jsonResponse = Unirest.post( "//www.mocky.io/v2/5a9ce7663100006800ab515d") .field("file", inputStream, ContentType.APPLICATION_OCTET_STREAM, "article.txt").asJson(); assertEquals(201, jsonResponse.getStatus()); } }

8. Unirest Configurations

The framework also supports typical configurations of an HTTP client like connection pooling, timeouts, global headers etc.

Let's set the number of connections and number maximum connections per route:

Unirest.setConcurrency(20, 5);

Configure connection and socket timeouts :

Unirest.setTimeouts(20000, 15000);

Note that the time values are in milliseconds.

Now let's set HTTP headers for all our requests:

Unirest.setDefaultHeader("X-app-name", "baeldung-unirest"); Unirest.setDefaultHeader("X-request-id", "100004f00ab5");

We can clear the global headers anytime:

Unirest.clearDefaultHeaders();

At some point, we might need to make requests through a proxy server:

Unirest.setProxy(new HttpHost("localhost", 8080));

One important aspect to be aware of is closing or exiting the application gracefully. Unirest spawns a background event loop to handle the operations, we need to shut down that loop before exiting our application:

Unirest.shutdown();

9. Conclusion

In this tutorial, we focused on the lightweight HTTP client framework – Unirest. We worked with some simple examples, both in a synchronous but also async modes.

Finally, we also used several advanced configurations – such as connection pooling, proxy settings etc.

Como de costumbre, el código fuente está disponible en GitHub.