Home UC3M
Home IT

Trabajando con URLs

 OBJETIVOS

El objetivo de esta práctica es aprender como se manejan recursos de Internet localizados a través de su URL desde un programa Java. Para ello vamos a hacer algunos programas sencillos con dos clases del paquete java.net: la clase URL y la clase URLConnection.

Al final de este práctica se proponen una serie de ejercicios complementarios, que os permitirá fijar los conocimientos y conocer un poco más los métodos que proporcionan estas clases.

OBLIGATORIO ENTREGAR EL EJERCICIO 2

 ENUNCIADO

URL es el acrónimo de Uniform Resource Locator. Su objetivo es identificar un recurso en el Web, de tal forma que podamos localizarlo a través de un programa cliente, típicamente un navegador. Java nos proporciona la clase URL del paquete java.net para representar objetos URL y acceder a ellos.
Como hemos visto en clase de teoría, una URL no especifica únicamente recursos Web a los que se accede a través del protocolo HTTP, sino que es una notación mucho más genérica, pero como veremos la clase java.net.URL está muy orientada a URL de HTTP.
Una URL que localiza recursos empleando el protocolo HTTP tiene los siguientes campos:

http://host[:puerto][/nombredelpathdelservidor][?argumentos]

  • host: El nombre de la máquina en la que reside el recurso. Éste parámetro es obligatorio.
  • [:puerto]: Número de puerto en el que el servidor escucha las peticiones. Es un parámetro opcional, sino se indica se considera el puerto por defecto.
  • [/nombredelpathdelservidor]: Path donde se encuentra el recurso en el sistema de ficheros del servidor. Es un parámetro opcional, sino se indica se proporciona la página por defecto del servidor web.
  • [?argumentos]: Parámetros que se envían al servidor, por ejemplo, cuando realizamos una consulta a una máquina de búsqueda.

Clase URL

  1. Creación de un objeto URL y obtención de campos

  2. Java proporciona varios contructores para crear objetos URL, veamos alguno de ellos:


    IMPORTANTE: Un objeto URL es de tipo "write-once", una vez creado un objeto URL con unos campos (protocolo, nombredelservidor, puerto,...) estos no se pueden modificar.

    La clase URL proporciona métodos para obtener los diferentes campos que forman una URL:


    Veamos la utilización de estos métodos con el siguiente ejemplo (código fuente Ejemplo_URL.java)

    import java.net.*;
    import java.io.*;
    public class Ejemplo_URL {
      public static void main (String[] args) throws Exception {
        try {
          // Constructor
          URL direccion = new URL("http://www.it.uc3m.es:80/index.html");
          // Divide las diferentes partes de una URL
          System.out.println("El protocolo utilizado es: " + direccion.getProtocol());
          System.out.println("El host es: " + direccion.getHost());
          System.out.println("El puerto es: " + direccion.getPort());
          System.out.println("El fichero es: " + direccion.getFile());
        } catch (MalformedURLException e) {
        System.out.println("Error en la construccion de la URL");
        }
      }
    }

  3. Método openStream


  4. El método InputStream openStream() nos permite recuperar los datos del recurso representado por la URL. Este método nos devuelve un InputStream del cual podremos leer el contenido del recurso que identifica la URL.

    Vamos a hacer un ejercicio en el que utilizaremos este nuevo método para sacar por pantalla el contenido de la página principal de la asignatura, identificada por la siguiente URL "http://karajan.it.uc3m.es:8081/CR/". Consejo: utilizad la clase BufferedReader para leer líneas desde el InputStream.

    Llamad a vuestro programa java LeerURL.java

Clase URLConnection

Si se quieren hacer más cosas que simplemente leer el recurso que tiene asociado una URL, se debe de utilizar la clase URLConnection que nos permite abrir una conexión con el recurso y realizar operaciones de lectura y escritura sobre el. Aunque lo de escribir os puede resultar chocante si pensais en un documento HTML, imaginaos ¿qué puede ocurrir si nos conectamos con un CGI?.
  1. Operación de lectura

  2. Antes de responder a esta pregunta, vamos a realizar una operación de lectura, repetiremos el mismo ejercicio que en el apartado anterior pero empleando la clase URLConnection, en este caso, los pasos que debeis seguir son:

    • Crear un objeto URL "http://karajan.it.uc3m.es:8081/CR/"
    • Abrir la conexión, obteniendo un objeto URLConnection a través del método openConnection()de la clase URL
    • Obtener un InputStream a partir del método getInputStream() de la clase URLConnection
    • Crear un BufferedReader para sacar por pantalla el contenido del recurso al que nos hemos conectado.

    Llamad a vuestro programa java ConexionLeerURL.java

  3. Operación de escritura

  4. Un CGI Common Gateway Interface define un interfaz para ejecutar programas en un servidor utilizando el protocolo HTTP. Este tipo de programas pueden recibir parámetros de entrada y como resultado generan una página HTML.
    Los valores de los parámetros se indican con pares "nombre_parametro=valor_parametro", separando los diferentes pares por el caracter &. La cadena así formada se codifica de la siguiente forma: los caracteres alfanuméricos se codifican igual, los caracteres no alfanuméricos se codifican con % seguido de dos dígitos que indican su valor en ASCII, los espacios en blanco se codifican como "+" y el "+" se codifica como %2b. A la cadena así codifica es lo que se denomina Query String.
    Estos parámetros de entrada suelen solicitarse al usuario a través de formularios. Cuando se envía el formulario la Query String correspondiente se envía al programa CGI de dos formas posibles:

    • Método GET:
      Se agrega a la URL la Query String separada por un signo de interrogación: http://host:[puerto][/nombredelpathdelservidor][?argumentos], y el programa CGI los recoge a través de una variable de entorno. Esto es lo que suele pasar cuando se realiza un consulta a una máquina de búsqueda: si bucais en el google la palabra CGI al pulsar el botón de "Búsqueda en Google", en el navegador nos aparece la siguiente URL http://www.google.com/search?hl=en&q=CGI&btnG=Google+Search

    • Método POST:
      Se agrega la Query String en el cuerpo del mensaje de forma que el programa CGI la lee por la entrada estándar

    Para más información sobre CGI ver el apartado de enlaces.

    Cuando abrimos una conexión con una URL que representa un CGI, el stream de salida de nuestra conexión está conectado a la entrada estándar del programa CGI, de manera análoga a cómo el stream de entrada está conectado a la salida estándar del programa CGI. De esta forma, escribir "sobre" una URLConnection nos permite interactuar desde nuestro programa Java con un programa CGI que emplee el método POST, veamoslo en el siguiente ejercicio.
    El ejercicio consiste en ejecutar el cgi localizado en http://karajan.it.uc3m.es/~celeste/cgi-bin/hola.cgi que lee una el parametro nombre de la entrada estándar, y su salida es una página HTML con el contenido "Hola [valor_nombre]". Los pasos que deberemos seguir en nuestro programa son:

    • Crear una URL a http://karajan.it.uc3m.es/celeste/cgi-bin/hola.cgi.
    • IMPORTANTE: Activar la capacidad de "escritura" en la conexión que por defecto no está activada, para ello llamar al método setDoOutput(boolean dooutput) con el parámetro "true".
    • Obtener un stream de salida de la conexión, dónde escribiremos un string que recibirá nuestro programa hola.cgi desde la entrada estándar, por ejemplo, nuestro nombre (para hacer el programa más flexible, ponedlo como un parámetro de entrada del programa Java). Consejo: emplear para escribir sobre el OutputStream la clase PrintWriter.
    • Cerrar el stream de salida.
    • Leer el resultado de la ejecución del cgi, a través del InputStream, de la misma forma que lo hemos hecho en el ejercicio anterior.

    El resultado que debemos obtener es:

    HOLA [valor_nombre]

    Llamad a vuestro programa Java ConexionURL.java

 MÁS EJERCICIOS

  • Ejercicio 1: Realizar un programa Java que acepte dos parámetros de entrada:
    1. Una URL que corresponda a un documento HTML
    2. Una etiqueta HTML
    Como resultado, el programa debe sacar por la salida estándar todas las líneas que contengan esa etiqueta.


  • Ejercicio 2: Realizar un programa Java que dada una URL inicial de un documento HTML, analice todos los enlaces que contenga a otras páginas HTML, y obtenga el número de veces que aparece una determina etiqueta HTML en cada una de ellas. Este programa debe de aceptar tres parámetros de entrada:
    1. Una URL inicial que corresponda a un documento HTML
    2. Etiqueta HTML
    3. Número máximo de enlaces que chequea (si existen más enlaces se dejan sin analizar)
    Como salida debe de proporcionar: la URL que chequea y el número de veces que aparece la etiqueta en esa página.

 ENLACES





inicio | tablón| contacta