sábado, 29 de noviembre de 2014

MELI - API - SDK - JAVA -Obtener datos con una petición GET


Estoy empezando a incursionar en las API de Mercado Libre y decidí crear una aplicación de ejemplo. 
La idea es utilizar la sdk de Java disponible para Mercado Libre para poder hacerlo. También existen para otros lenguajes como PHP, Python, entre otros. En esta github de mercado libre podes encontrar más información.

En este ejemplo vamos a utilizar la sdk de java.

Los pasos son los siguentes:

1) Para poder conectarse con las API de MELI es necesario utilizar el Aplication Manager. En ese link van a encontrar information de como crear el App id y el Secret Key.

2) Una vez que tenemos el App id (clientID) y el Secret Key(clientSecret) vamos a bajar la sdk-Java de Mercado Libre.
Para proyectos maven solamente con agregar un nuevo repositorio alcanza.

<repositories>
    ...
    <repository>
         <id>mercadolibre-snapshots</id>
         <url>https://github.com/mercadolibre/java-sdk-repo/raw/master/snapshots</url>
    </repository>
    ...
</repositories>

Y después la dependencia

<dependencies>
       ...
       <dependency>
             <groupId>com.mercadolibre</groupId>
             <artifactId>sdk</artifactId>
             <version>0.0.2-SNAPSHOT</version>
      </dependency>
      ...
</dependencies>


3) Una vez configurado su entorno vamos a proceder a realizar la comunicación con MELI.

Creamos una nueva clase llamada Site como sigue:

public class Site {

    private final String id;
    private final String name;

    public Site(final String id, final String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Site{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

Esta clase va a contener toda la información de los Sites.

Luego creamos un SiteHandler para realizar las consultas.

public class SiteHandler {
   //Nombre de los campos que vamos a obtener informacion
    private static final String ID_KEY = "id";
    private static final String NAME_KEY = "name";
    //Creamos una unica instancia de Meli.
    private final Meli meli;

    private static final SiteHandler instance = new SiteHandler();

    private SiteHandler() {
        //Aca creamos el objecto Meli con la información de su aplicación.
        meli = new Meli(clientId, clienteSecret);
    }

    public static SiteHandler getInstance() {
        return instance;
    }

    public List<Site> getAllMeliSite()  {
        //Todos los sites.
        final List<Site> newSites = new ArrayList<Site>();
        try {
            //Aqui realizamos la consulta de todos los sites.
            final Response response = meli.get("/sites/");
            //Objeto gson que sirve para "parsear" los resultados.
            final Gson gson = new Gson();
            //Convertimos desde JSON a Java creando una lista de StringMap
            final List<StringMap<String>> sites = gson.fromJson(response.getResponseBody(), List.class);
            //Convertimos los objectos StringMap a Site.
            for (final StringMap<String> entries : sites) {
                newSites.add(new Site(entries.get(ID_KEY), entries.get(NAME_KEY)));
            }
        } catch (MeliException ex) {
            //Logger error en la respuesta
            System.out.println("Error " + ex.getMessage());
        } catch (IOException e) {
            //Logger error en la transformacion usando de gson.
            System.out.println("Error " + e.getMessage());
        }
        return newSites;
    }
}

Por último creamos un objeto main para que ejecute lo anterior:

public class Main {

    public static void main(String[] args) throws Exception {
        final List<Site> sites = SiteHandler.getInstance().getAllMeliSite();

        for (final Site site: sites) {
            System.out.println(site);
        }
    }   
}

Espero que sirva este sensillo ejemplo.

El ejemplo completo lo pueden encontrar en este link


Referencias:
https://github.com/mercadolibre/java-sdk
http://developers.mercadolibre.com/application-manager/
http://www.java2blog.com/2013/11/gson-example-read-and-write-json.html
http://developers.mercadolibre.com/api-directory/#close




16 comentarios:

  1. Hola buenos dias, escribo porque la verdad necesito avanzar mas en este tipo de API de ML, pero la verdad es que ando como perdido en cuanto al como iniciar en este nuevo ambiente de desarrollo, estoy estancado cuando dices que debemos crear la nueva clase "public class Site", entonces mi pregunta es ¿en que fichero o proyecto creo dichas clases que mencionas?, mnuchas gracias y espero no incomodar.

    ResponderEliminar
    Respuestas
    1. Hola Johan, La clase "site" y siteHandler son dos clases de ejemplo de un proyecto en java que tu puedes crear.

      En el ejemplo que detallo es para realizar una conexión usando la jdk de Meli pero dependiendo del lenguaje puedes utilizar otra.

      Aquí te dejo el proyecto de ejemplo que puedes ver con mas detalles:
      https://github.com/fedecoraglio/meli-java-example

      Eliminar
    2. La verdad lo que busco es como iniciar para desarrollar una aplicacion con la API de ML (Hacer publicaciones masivas y poder contestar preguntas desde la aplicacion). pero aun estoy como algo perdido, descargue el SDK de Java, abri el proyecto desde eclipse, examine cada parte del SDK, pero aun no encuentro la forma de iniciar, voy a la parte de "pom.xml" que se supone debo de agregar el repositorio pero me salen son unas pestañas con unos datos (Artifact,Parent,Properties,Modules,Project,Organization,SCM,Issue Management,Continues integration). Te pido que me ayudes a progresar en este nuevo desafio, estoy infinitamente agradecido porque recibi respuesta. GRACIAS!

      Eliminar
  2. Hola buenas. Primero muchas gracias por esta aplicación de ejemplo. estoy tratando de entender como funciona.
    Me baje lo que tenes aca https://github.com/fedecoraglio/meli-java-example pero hay varios import que no funcionan. y no se si esto tiene que estar en el mismo proyecto que el sdk de java (Recurso disponible de ML) o aparte, el sdk de java ya tiene los mismos import y andan. gracias!

    ResponderEliminar
    Respuestas
    1. Hola Matias, Me baje el código nuevamente y luego ejecute "mvn clean install" y compilo con éxito. Recuerda posicionarte en la carpeta meli-java-example desde una consola y ejecutar el comando de maven para bajar las dependencias. Si no lo tienes instalado te pueden fijar aqui: https://www.mkyong.com/maven/how-to-install-maven-in-windows/

      Lo voy a estar revisando esta semana al código cualquier cosa te escribo nuevamente, pero como te dije recién no deberías tener problemas de compilación.

      Eliminar
    2. Gracias por contestar. Me voy a fijar de ejecutar el mvn clean install. Las preondiciones de bajar este proyecto es tener la sdk de meli instalada ? Gracias y saludos.

      Eliminar
    3. No, justamente con el mvn clean install te baja el sdk de Meli. Fijate que esta en el pom.xml

      Eliminar
  3. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  4. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  5. Logre tener las librerias instaladas! muchisisimas gracias, ahora voy por la autentificación saludos!

    ResponderEliminar
  6. Hola buenas, vuelvo a molestar! es una consulta, cuando modifico este pedazo de codigo:

    private SiteHandler() {
    //Aca creamos el objecto Meli con la información de su aplicación.
    meli = new Meli(clientId, clienteSecret);

    cambio el clienId por mi ID pero cuando lo hago me dice que estoy fuera del rango, que Meli esta definido para un int y mi ID esta fuera del rango del int, voy al codigo fuente y lo modifico? lo mismo con el clientSecret. Gracias.

    ResponderEliminar
    Respuestas
    1. Hola Matias,


      Probaste con algo como esto:
      meli = new Meli(123456784546546549L, "secret_key");

      Me refiero de agregar al final del valor la "L" para indicarle que es un long.

      Eliminar
  7. Gracias!!! ahora si. el proyecto que realizaste en el main es para mostrar los sites de meli no?

    ResponderEliminar
  8. Hola! estoy intentando hacerlo funcionar pero me da un error con:
    import com.google.gson.internal.StringMap;

    Al parecer ya no esta disponible!
    y no me toma la parte del codigo:

    final List> sites = gson.fromJson(response.getResponseBody(), List.class);
    //Convertimos los objectos StringMap a Site.
    for (final StringMap entries : sites) {
    newSites.add(new Site(entries.get(ID_KEY), entries.get(NAME_KEY)));
    }

    Como se podría solucionar?

    ResponderEliminar
    Respuestas
    1. Hola Oscar, fijate si en esta guia podes ver la forma de pasar un JSON a un objeto java.
      https://medium.com/el-acordeon-del-programador/convertir-objetos-java-a-json-y-de-regreso-1077500d78f7
      https://elbauldelprogramador.com/como-mapear-json-a-objetos-java-con-jackson-objectmapper/
      Este código esta viejo, también fijate en la documentación ofical de Mercado libre por si algo cambio

      Eliminar
  9. Muchas gracias, me sirvió como punto de partida

    ResponderEliminar