Martes, 18 Abril 2017 00:00

Cliente Rest en java con Jersey (Consola/Swing)

Escrito por 
Valora este artículo
(0 votos)

Si quisieramos  consumir Web services desde  una aplicacion de consola/desktop java, una alternativa es usar las librerias de Jersey, a continuacion veremos un sencillo ejemplo de como poder hacerlo.

 

A continuacion las dependencias que necesitamos, en este caso sobre Maven

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<dependencies>
        <!-- https://mvnrepository.com/artifact/javax.ws.rs/javax.ws.rs-api -->
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-client -->
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-client</artifactId>
            <version>1.19</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.glassfish.jersey.core/jersey-server -->
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-server</artifactId>
            <version>2.22.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-json -->
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-json</artifactId>
            <version>1.19</version>
        </dependency>
</dependencies>

Para este caso parto de que cuento con  una clase Persona

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package client;
 
/**
 *
 * @author rafa22
 */
public class Persona {
    private Integer id;
    private String nombre;
 
    public Persona() {
    }
 
    public Integer getId() {
        return id;
    }
 
    public void setId(Integer id) {
        this.id = id;
    }
 
    public String getNombre() {
        return nombre;
    }
 
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    
}

Luego, para mi caso tengo una clase ClienRest  que me sirve para  la configuracion comun de todas mis peticiones que realice

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package client;
 
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.json.JSONConfiguration;
 
/**
 *
 * @author rafa22
 */
public class ClientRest {
 
    protected WebResource webResource;
    protected Client client;
    protected static final String BASE_URL = "http://localhost:8080/web-services/public/v1/";
 
    public ClientRest(String path) {
        ClientConfig cc = new DefaultClientConfig();
        cc.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
        client = Client.create(cc);
        this.webResource = client.resource(BASE_URL).path(path);
    }
 
}

Para describir sencillamente, en la linea 20 creamos la configuracion para  un cliente, la linea 21 es necesaria para poder mapear nuestro Json a una clase java de nuestro dominio, en la siguiente linea creamos  un cliente con la configuracion anteriormente, y por ultimo la webresource le asignamos el cliente, a este previamente le asignamos el resource, el BASE_URL, mas un String path que le pasamos en el contructor. Por ejemplo le pasamos la constante BASE_URL + path ( "http://localhost:8080/web-services/public/v1/" + "personas")

 Ahora  tendo una clase  que hereda de la anterior clase explicada

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package client;
 
 
import com.sun.jersey.api.client.GenericType;
import java.util.List;
import javax.ws.rs.core.MediaType;
 
/**
 *
 * @author rafa22
 */
public class ClientPersona extends ClientRest {
    
    public ClientPersona(String path) {
        super(path);
    }
    
    public List<Persona> getPersonas(){
        return this.webResource.path("all").accept(MediaType.APPLICATION_JSON).get(new GenericType<List<Persona>>(){});
    }
    
}

Lo importante de esta ultima clase es el metodo getPersonas(),  que me llama al Web service rest

http://localhost:8080/web-services/public/v1/personas/all

La estructura del Json que me devuelve el rest es

1
2
3
4
5
6
[
  {
    "id": 1,
    "nombre": "Patricia Geronimo"
  }
]

Este Json es un arreglo de Personas (El item del arreglo coincide con la estructura del POJO Persona), a este lo mapeamos  mediante new GenericType<List<Persona>>(){},  si por  ejemplo nesecitamos traer solamente una persona el   metodo seria asi

1
2
3
    public Persona getPersona(){
        return this.webResource.accept(MediaType.APPLICATION_JSON).get(Persona.class);
    }    

Por ultimo probamos  en un metodo main

1
2
3
4
5
6
7
8
9
    public static void main(String[] args) throws Exception {
       
        ClientPersona clientRest = new ClientPersona("personas");
        List<Persona> personas = clientRest.getPersonas();
        for (Persona personas : persona) {
            System.out.println("salida:" + persona.getNombre());
 
        }
    }

Bueno, aclaro que  hay otras formas de poder consumir  un ws desde un cliente, pero esta me  parece la mejor por   como esta estructurado y las cantidad de opciones que tenemos para poder configurar  nuestras peticiones. Hasta pronto

Visto 154 veces Modificado por última vez en Miércoles, 19 Abril 2017 00:19

Deja un comentario

Asegúrate de llenar la información requerida marcada con (*). No está permitido el código HTML. Tu dirección de correo NO será publicada.