Buscar este blog

19 junio 2008

WebRequest y WebResponse

Hola amigos, en este post veremos las clases HttpWebRequest y HttpWebResponse pertenecientes al espacio de nombre “System.Net”. Estas clases implementan métodos y propiedades de las calases abstractas WebRequest y WebResponse respectivamente, pero están especialmente diseñadas para encapsular todo lo referente al protocolo HTTP. ¿Y para qué sirve? esto nos puede servir por ejemplo para realizar pedidos (GET) y/o para enviar información (POST) a un servidor web HTTP de manera programática. (Otra alternativa es la clase WebClient).

De esta manera una petición http y su respuesta se lograría en VB.NET así:
Imports System
Imports System.IO
Imports System.Net
Imports System.Web
Imports System.Text

Module Module1
Sub Main()
Try
Dim req As WebRequest = WebRequest.Create("http://www.google.com")
Dim resp As WebResponse = req.GetResponse()
Dim data As Stream = resp.GetResponseStream()
Dim reader As New StreamReader(data)
Dim linea As String = String.Empty

Do
linea = reader.ReadLine
Console.WriteLine(linea)
Loop Until Not IsNothing(linea)

reader.Close()
resp.Close()
Catch WebEx As WebException
Console.WriteLine()
Console.WriteLine(WebEx.Message)
Finally
Console.WriteLine()
Console.WriteLine("Presione una tecla para continuar...")
Console.ReadKey()
End Try
End Sub
End Module

Como resultado deberíamos obtener el código fuente de la página resultante.
En este caso WebRequest.Create al observar de que se trata del protocolo http por la URI solicitada creará una instancia de HttpWebRequest.

Las dos primeras líneas son equivalentes a las siguientes:
Dim req As HttpWebRequest = WebRequest.Create("http://www.google.com")
Dim resp As HttpWebResponse = req.GetResponse()

También podíamos haber hecho lo anterior de esta manera:
Dim client As New WebClient()
Dim data As Stream = client.OpenRead("http://www.google.com")
Dim reader As New StreamReader(data)
Dim pagina As String = reader.ReadToEnd()
Console.WriteLine(pagina)

En cualquiera de los casos podemos alterar la información del encabezado HTTP como queramos y poder simular peticiones http como si fueran generadas desde un navegador web (IE, Firefox, etc..) o desde un dispositivo móvil.

Como vemos en el listado siguiente un request mas completo con alguna información de encabezado http personalizada:
...
request = WebRequest.Create("http://..........")
data = Encoding.ASCII.GetBytes(postData)

With request
.ContentType = "application/x-www-form-urlencoded"
.Method = "POST"
.ContentLength = data.Length
.CookieContainer = _CC
.Accept = "image/gif, image/x-xbitmap, image/jpeg, _
image/pjpeg, application/x-shockwave-flash, _
application/x-ms-application, application/x-ms-xbap, _
application/vnd.ms-xpsdocument, application/xaml+xml, _
application/vnd.ms-excel, application/vnd.ms-powerpoint, _
application/msword, application/x-silverlight, */*"
.Referer = "http://.........."
.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; _
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; _
.NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; _
.NET CLR 3.5.21022)"
End With

resStream = request.GetRequestStream()
resStream.Write(data, 0, data.Length)
resStream.Close()
...

Con estos conocimientos básicos podríamos hacer lo siguiente: instalamos cualquier programita sniffer http para observar y/o ir guardando las distintas interacciones con algún servidor web http y después reproducirlas (armar los mismos segmentos http) de manera parametrizada y a velocidad controlada por nosotros simulando un usuario (o cientos) navegando. También podríamos hacer esto de manera repetitiva y rápida (como robots) contra nuestros (y no ajenos ;-) web servers para hacer pruebas de rendimiento y seguridad. Otra utilidad podría ser insertar información extraída desde una página web o de un web service en nuestras aplicaciones de escritorio por ejemplo, y/o enviar información vía http desde nuestras aplicaciones, bajar y/o enviar archivos, utilizar consultas LINQ2XML para extraer información mas cómoda de los documentos HTML, hacernos un navegador de consola ;) y todas las combinaciones que se les ocurran…

En el próximo post les muestro una pequeña aplicación que utiliza lo explicado aquí, mientras tanto a probar sin miedo! Saludos.

Enlaces relacionados: MSDN (WebRequest, WebResponse, HttpWebRequest, HttpWebResponse), Rick Strahl

No hay comentarios.: