JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Cómo llamar a una página Web desde código

<DISCLAIMER>Han pasado unos cuantos días desde que he podido postear algo nuevo. Me ha pillado de lleno el famoso volcán islandés que ha paralizado el tráfico aéreo en Europa, por lo que he estado atrapado varios días en Bruselas sin posibilidad de salir de allí y, lo que es peor, ¡sin ordenador ni Internet! :-S </DISCLAIMER>

Esta es una pregunta muy habitual que he visto por ahí y que realmente es muy sencilla de poner en marcha:

"¿Cómo puedo llamar a una página Web (o recurso remoto HTTP) desde mi propio programa y mostrar el resultado en mi aplicación?"

La respuesta es muy sencilla, pero no todo el mundo sabe cómo hacerlo. Básicamente hay que utilizar la clase WebRequest. Este método, por ejemplo, sirve para solicitar un determinado recurso a partir de su URL, que se le pasa como parámetro, devolviendo una cadena con el contenido del recurso (o generando una excepción si el recurso no existe o da un error):

	static string LeerRecursoWeb(string laUrl)
	{
		// Cear la solicitud de la URL.
		WebRequest request = WebRequest.Create(laUrl);
		// Obtener la respuesta.
		WebResponse response = request.GetResponse();
		// Abrir el stream de la respuesta recibida.
		StreamReader reader = new StreamReader(response.GetResponseStream());
		// Leer el contenido.
		string res = reader.ReadToEnd();

		// Cerrar los streams abiertos.
		reader.Close();
		response.Close();
		
		// Devolver resultado
		return res;
	}

Cómo vemos es bastante directo. Ahora, por ejemplo, podemos mostrar los enlaces más relevantes sobre ASP.NET en Delicious usando el siguiente código (en este caso para una aplicación de consola, pero valdría para cualquier otra):

		Console.WriteLine(LeerRecursoWeb("http://feeds.delicious.com/v2/RSS/popular/ASP.NET"));

Muy sencillo.

Los detalles importantes

Hay algunos detalles que merece la pena comentar.

La clase WebRequest es abstracta. Esto quiere decir que no se usa directamente, sino que se utiliza para crear otras clases derivadas que implementan los métodos apropiados según el protocolo a utilizar. Por ello existen en la plataforma .NET otras clases más especializadas como HttpWebRequest, FtpWebRequest o FileWebRerquest, especializadas en llamar a recursos por HTTP, por FTP y por el sistema de archivos respectivamente.

El método Create de la clase abstracta, en función de la URL que le pasemos, crea la clase derivada adecuada para gestionar el protocolo que se deba utilizar y obntener así el resultado. Gracias a ello, la función que pongo más arriba funcionaría también con las siguiente URLs:

		Console.WriteLine(LeerRecursoWeb("ftp://ftp.miservidor.com/carpeta/miarchivo.txt"));
		Console.WriteLine(LeerRecursoWeb("file://c:\MiCarpeta\Miarchivo.txt"));

De este modo el código se adapta a la URL usando la clase más apropiada en cada caso, lo que nos da mucha flexibilidad.

Por supuesto si quisiésemos restringir el uso a un protocolo concreto, como solamente el HTTP, es posible usar de manera directa cada una de estas clases especializadas y el código sería igual.

También existen otras clases especializadas, como por ejemplo WebClient, que nos permiten más control y enviar datos además de recibirlos, pero para responder a la pregunta planteada y poder empezar a investigar un poco por tu cuenta tienes material más que de sobra :-)

NOTA: Por cierto, hay que incluir los espacios de nombres System.IO y System.Net, no te olvides...

José Manuel Alarcón
Banner

Comentarios (2) -

Argentina Mauricio Scheffer

Cerrar los streams de esa forma es incorrecto. Si salta una excepción al bajar la respuesta, los streams no se cerrarán. Para eso está la interfaz IDisposable y la keyword 'using'.
Además, si es para cosas básicas, System.Net.WebClient es mucho más fácil de usar.

Responder

Spain JM Alarcón

Hola Mauricio:

Gracias por el comentario, pero en ningún momento he dicho que esto fuera un código para usar en producción. Por supuesto que hay que usar using o una gestión de excepciones para deshacerte adecuadamente de cualquier objeto IDisposable. Se trata ilustrar un concepto concreto, no de dar un curso de buenas prácticas.

Si te parece estaría bien que te pasaras por la página de MSDN aquí:

msdn.microsoft.com/.../...ebrequest(v=VS.100).aspx

donde Microsoft pone el mismo ejemplo y les pusieses el mismo comentario (ahora MSDN te lo permite).

Saludos,

Responder

Agregar comentario