Un cliente Jersey que consume Google AJAX search API – Rest & Java


Uno de los API’s, dentro del mundo Java, que permiten trabajar con servicios Web basados en REST se denomina Jersey. Este API viene incluido con NetBeans desde ya hace algunas versiones atrás. Inclusive en el sitio de NetBeans existe documentación en donde se muestra como crear un servicio Web Rest basado en una tabla de una base de datos. Pero no existe ninguna documentación, al menos en sitio de NetBeans, que muestre como crear un cliente Jersey que consuma algún servicio Rest.

Buscando en la Web encontré un par de ejemplos. Uno de ellos Consuming RESTful Web Services With the Jersey Client API, desarrolla un cliente (en modo consola) de Twitter.

Otro ejemplo bastante sencillo, pero no menos ilustrativo se llama Yahoo Search Restful Client using Jersey, aquí se desarrolla un cliente que consume el servicio de búsqueda de Yahoo. Dicho servicio de búsqueda devuelve los resultados en XML así que es necesario usar JAXB Binding para obtener las clases que representaran la información.

No he encontrado un ejemplo en donde se trabaje con JSON, tomando en cuenta que ese formato es bastante popular hoy por hoy. Así que me decidí a elaborar un cliente Jersey que consuma el API de Google AJAX search que devuelve información en JSON. El código desarrollado es el siguiente:

package ecc.edu.utpl;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import java.util.Scanner;
import javax.ws.rs.core.MediaType;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

/**
 *
 * @author jorgaf
 */
public class ClienteGoogle {

    public static void main(String[] args) {
        Scanner lector = new Scanner(System.in);
        String consulta;
        char opc = 'S';
        String URI = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=";
        Client cliente = Client.create();
        do {
            do {
                System.out.print("Ingrese el texto a buscar: ");
                consulta = lector.nextLine();
                consulta = consulta.trim();
                consulta = consulta.replace(" ", "%20");
            } while (consulta == null || consulta.length() == 0);

            URI += consulta;
            WebResource recurso = cliente.resource(URI);
            String result = recurso.accept(MediaType.APPLICATION_JSON).get(String.class);
            try {
                System.out.printf("---RESULTADOS:%s---\n", consulta);
                mostarResultados(result);
                System.out.printf("---%d páginas aprox.---\n",
                        obtenerTotalResultados(result));
            } catch (JSONException ex) {
                ex.printStackTrace();
            }
            System.out.println("\n-------------------------------");
            System.out.println("¿Desea realizar otra búsqueda?");
            System.out.print("Presione S(Si) o N(No): ");
            opc = lector.next().charAt(0);
            System.out.println();
        } while (opc != 'N');

    }

    public static void mostarResultados(String respuesta) throws JSONException {
        JSONObject objJSON = new JSONObject(respuesta);
        JSONObject responseData = objJSON.getJSONObject("responseData");
        JSONArray results = responseData.getJSONArray("results");
        for (int i = 0; i < results.length(); i++) {
            JSONObject link = results.getJSONObject(i);
            System.out.printf("URL: %s\n", link.getString("url"));
            System.out.printf("Title: %s\n", link.getString("title"));
            System.out.printf("Contenido: %s\n", link.getString("content"));
            System.out.println();
        }
    }

    public static long obtenerTotalResultados(String respuesta){
        long total = 0;
        try {
            JSONObject objJSON = new JSONObject(respuesta);
            JSONObject responseData = objJSON.getJSONObject("responseData");
            JSONObject cursor = responseData.getJSONObject("cursor");
            total = cursor.getLong("estimatedResultCount");
        } catch (JSONException ex) {
            ex.printStackTrace();
        }
        return total;
    }
}

Para poder realizar este cliente tuve que agregar las siguientes librerías adicionales:

Las tres primeras librerías se pueden descargar desde la Web haciendo clic en cada uno de los enlaces. Pero el último lo agregué desde NetBeans. La siguientes imágenes les guiarán en ese proceso.

Menu a utilizar para agregar la librería

Librería que debe agregar

Los métodos mostrarResultados y obtenerTotalResultados, son los encargados de trabajar con JSON. Para conocer la estructura JSON de la información devuelta por Google hagan clic aquí y busquen el tema “Entornos Flash y otros entornos que no utilizan JavaScript” que casi se encuentra al final.

Espero que este post les ayude.

9 comentarios en “Un cliente Jersey que consume Google AJAX search API – Rest & Java

  1. Crystian Haro Vinueza dijo:

    Buenas Jorge queria preguntarle si este tipo de tema podria utilizarse como plan de tesis.? y que otros temas de este tipo se podrian utilizar. gracias de antemano.

  2. juan carlos dijo:

    Buenas!

    Muy buena información, ¿habría alguna manera de obtener el contenido completo de la noticia?

    Mediante la orden ‘link.getString(“content”));’ obtenemos el contenido de la noticia, pero para mi aplicación necesitaría obtener el cuerpo completo de la noticia. ¿Es posible?

    Gracias

  3. Hola juan carlos,

    El objeto link pertenece a la clase JSONObject y es el que contiene toda la información; con esos objetos deberías trabajar.

    Toma en cuenta que el ejemplo no muestra todos los campos que se devuelve. En la siguiente página http://code.google.com/intl/es-ES/apis/ajaxsearch/documentation/ (bajo el título: Entornos Flash y otros entornos que usan JavaScript) encontrarás un ejemplo de los datos que se te devuelven.

    Saludos

  4. juan carlos dijo:

    Gracias!

    Ya había leido esa documentación previamente, está muy bien, pero lo único que encontré al respecto era el parámetro results[“content”], este parámetro me resulta insuficiente porque no recoge la noticia entera, solo un pequeño resumen. seguido de puntos suspensivos.

    Mi intención es incluir en una web el cuerpo entero de las noticias, ¿conoceis alguna otra posibilidad para obtenerlo?

    Un saludo!

  5. Ismael Saenz dijo:

    respecto a la libreria JSON.org, cual archivo es el q se descarga? porque al utilizar los imports, marca error, ya baje varios y con ninguno me funciono, gracias!

  6. crease dijo:

    Buenos días,

    habría posibilidad de aumentar el número de resultados de la respuesta??
    Y como se mencionó en unos de los post, cabría la posibildad de aumentar la descripción de la respuesta, es decir, que el content devolviera más información y no lo dejara con puntos suspensivos??

    Muchas gracias.

  7. Pingback: MAVEN

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s