domingo, 26 de octubre de 2014

Integración con Servicios Web

Existen distintas tecnologías, plataformas, lenguajes y formas de implementar Web Services. En este caso se va a implementar una aplicación web sencilla para consulta de información utilizando tecnología Java, la cual devolverá la información en formato JSON.
En primer lugar, comentar que el Eclipse ADT Bundle no está habilitado para la implementación de aplicaciones web, por lo que será necesario recurrir a otro tipo de entorno como Eclipse IDE for JavaEE, que se trata de un entorno hermano al ADT Bundle, o Netbeans si se busca un entorno muy sencillo de configurar y emplear.
En cualquiera de los dos casos habrá que trabajar con dos IDEs abiertos en el mismo equipo, lo cual puede perjudicar a la memoria del mismo, más aún si se emplean emuladores de dispositivos móviles. La gran ventaja es poder depurar en ambos lados de la comunicación para ver en qué punto del sistema se puede encontrar algún error.

Lo mínimo necesario

Una clase JavaBean que representa la información del sistema:
public class Equipo {
        
    private String nombre;
    private float presupuesto;
    private int clasificacion;
    private int gf;
    private int gc;
   
    public Equipo(){
       
    }

    public Equipo(String nombre, float presupuesto, int clasificacion,
int gf, int gc) {
        this.nombre = nombre;
        this.presupuesto = presupuesto;
        this.clasificacion = clasificacion;
        this.gf = gf;
        this.gc = gc;
    }

    public int getClasificacion() {
        return clasificacion;
    }

    public void setClasificacion(int clasificacion) {
        this.clasificacion = clasificacion;
    }

    public int getGc() {
        return gc;
    }

    public void setGc(int gc) {
        this.gc = gc;
    }

    public int getGf() {
        return gf;
    }

    public void setGf(int gf) {
        this.gf = gf;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public float getPresupuesto() {
        return presupuesto;
    }

    public void setPresupuesto(float presupuesto) {
        this.presupuesto = presupuesto;
    }
   
}

Una clase de servicio para el acceso a la información, en este caso de ejemplo la información se obtiene de forma directa, lo habitual será emplear un motor de persistencia y los métodos adecuados para acceder a la información contenida en una base de datos:
public class EquipoSvc {
        
    /**
     * Obtener la lista de equipos
     * A sustituir por acceso a bdd
     * @return lista de equipos
     */
    public List<Equipo> listar(){
        List<Equipo> lista = new ArrayList<Equipo>();
        lista.add(new Equipo("Nottingham Prisa", 1.2F, 1, 16, 3));
        lista.add(new Equipo("Steaua Nobebere", 0.9F, 2, 7, 4));
        lista.add(new Equipo("Dinamo de Bici", 0.7F, 3, 6, 5));
        lista.add(new Equipo("Atlético Agujetas", 0.00001F, 4, 1, 18));
       
        return lista;
    }
}

Un Servlet para permitir el acceso a la información. Es imprescindible disponer de la API Gson configurada en el proyecto, la cual se encarga de la transformación de objetos Java a su representación JSON correspondiente:
@WebServlet(name = "ChampionWS", urlPatterns = {"/ChampionWS"})
public class ChampionWS extends HttpServlet {
   
    private static final String PARAM_OP = "op";
    private static final String OP_EQUIPOS = "equipos";

    @Override
    protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
        //Habilitado en desarrollo para poder probar con el navegador
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
        response.setContentType("application/json;charset=UTF-8");
        PrintWriter out = response.getWriter();
       
        try{
            //Obtener la operación que requiere el usuario
            String op = request.getParameter(PARAM_OP);
               
            //Responder al usuario en función de la operación solicitada
            if (op.equals(OP_EQUIPOS)) {
                equipos(request, out);
            }
        } catch (Exception ex) {
            out.println(ex);
        } finally {
            out.close();
        }
    }
   
    /**
     * Obtener la lista de equipos
     * @param request
     * @param out
     * @throws Exception
     */
    private void equipos(HttpServletRequest request, PrintWriter out)
throws Exception {
        //Obtener la lista de equipos
        EquipoSvc svc = new EquipoSvc();
        List<Equipo> lista = svc.listar();
       
        //Si los datos contienen fecha se formatearán con el patrón
        Gson gson = new GsonBuilder().
setDateFormat("yyyy-MM-dd HH:mm:ss").create();
        //El objeto Gson transforma automáticamente la lista a formato JSON
        out.println(gson.toJson(lista));
    }

}

Referencias

https://code.google.com/p/google-gson/

No hay comentarios:

Publicar un comentario