Posteado por: Jorge López (jorgaf) | enero 24, 2010

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.

About these ads

Respuestas

  1. 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. 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. 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. 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!

    • creo q deberias poner q JSON.org se agrega como source packages

  6. Como capturas excepciones del tipo BAD REQUEST ERROR 400 en la clase WebResource.

  7. 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.

  8. [...] http://cafelojano.wordpress.com/2010/01/24/un-cliente-jersey-que-consume-google-ajax-search-api-rest… Posted by admin Uncategorized Subscribe to RSS feed [...]


Deja un comentario

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 )

Conectando a %s

Categorías

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 104 seguidores

%d bloggers like this: