domingo, 7 de abril de 2019

Como hacer un REST web service client con Apache HTTPClient Fluent

Ya hemos visto otras veces como hacer servicios REST. Por ejemplo con Jersey, cuyo ejemplo usaremos como webservices sobre el que crear el cliente. Para hacer el cliente usaremos Apache HttpClient, versión 4.5. Además usaremos la librería 'Fluent' que nos permite crear el ejemplo de forma más dinámica.

Esta librería 'Fluent' esta basada en el patrón 'Fluent facade interface', lo que nos permite una programación más dinámica. Por un lado permitiendonos enlazar la invocación de un método con el siguiente. Y por el otro al exponer unicamente los métodos necesarios en un intento de simplificación a la hora de programar.

Nos ayudaremos de la librería 'Gson' para pasar las conversiones a Json.
  • GET
Aquí tenemos un ejemplo de como usar el Get y recuperar el contenido devuelto

public List<Book> getAll() throws ClientProtocolException, IOException {
 String jsonResponse = Request.Get(URL).execute().returnContent().asString();
 java.lang.reflect.Type listType = 
  new TypeToken<ArrayList<Book>>(){}.getType();
 List<Book> yourClassList = new Gson().fromJson(jsonResponse, listType);
 return yourClassList;
}
  • POST
Aquí tenemos un ejemplo de POST. Donde por un lado forzamos a que use HTTP version 1.1 y 'expect continue' (para que el servidor nos indique antes de procesar la petición si la acepta, basandose en las cabeceras). Y además añadimos el cuerpo como un String e indicando el content-type.

public int saveOne(final Book book) throws ClientProtocolException, IOException {
 String bookJson = new Gson().toJson(book);
 return Request.Post(URL).bodyString(bookJson, ContentType.APPLICATION_JSON)
  .useExpectContinue().version(HttpVersion.HTTP_1_1).execute()
  .returnResponse().getStatusLine().getStatusCode();
}
  • PUT
Aqui tenemos el ejemplo de PUT. En el podemos ver dos formas de indicar el cuerpo de la petición con un HTTPEntity (una de ellas comentada), y como incluir nuestras propias cabeceras.


public int updateOne(final Integer id, final Book book) throws ClientProtocolException, IOException {
 String bookJson = new Gson().toJson(book);
 // StringEntity requestEntity = new StringEntity(bookJson, ContentType.APPLICATION_JSON);
 StringEntity requestEntity = new StringEntity(bookJson);
 return Request.Put(URL + "/" + id).body(requestEntity)
  .addHeader("Conten-Type", "application/json").execute()
  .returnResponse().getStatusLine().getStatusCode();
}
  • DELETE
Aquí tenemos el ejemplo del DELETE. Donde obtenemos el código de la respuesta del servidor y la devolvemos como retorno, a igual que hemos hecho en el POST o el PUT.

public int deleteOne(final Integer id) throws ClientProtocolException, IOException {
 return Request.Delete(URL + "/" + id).execute()
  .returnResponse().getStatusLine().getStatusCode();
}

No hay comentarios:

Publicar un comentario