2008-09-18 10 views
34

Escribo una pequeña herramienta en C# que necesitará enviar y recibir datos hacia/desde un sitio web utilizando el formato POST y json. Nunca antes había hecho algo como esto en C# (o en cualquier otro idioma), así que estoy luchando por encontrar información útil para ayudarme a comenzar.¿WebRequest es la herramienta correcta de C# para interactuar con sitios web?

He encontrado información sobre la clase WebRequest en C# (específicamente en here) pero antes de comenzar a bucear en ella, me pregunté si esta era la herramienta adecuada para el trabajo.

He encontrado muchas herramientas para convertir datos en el formato json pero no mucho más, por lo que cualquier información sería realmente útil aquí en caso de que termine en un callejón sin salida.

Respuesta

25

WebRequest y más específicamente la clase HttpWebRequest es un buen punto de partida para lo que quiere lograr. Para crear la solicitud, utilizará WebRequest.Create y enviará la solicitud creada a HttpWebRequest para que realmente la use.A continuación, crear sus datos de envío y enviarlo a la corriente como:

HttpWebRequest req = (HttpWebRequest) 
WebRequest.Create("http://mysite.com/index.php"); 
req.Method = "POST"; 
req.ContentType = "application/x-www-form-urlencoded"; 
string postData = "var=value1&var2=value2"; 
req.ContentLength = postData.Length; 

StreamWriter stOut = new 
StreamWriter(req.GetRequestStream(), 
System.Text.Encoding.ASCII); 
stOut.Write(postData); 
stOut.Close(); 

Del mismo modo se puede leer la respuesta de nuevo utilizando el método GetResponse que permitirá a leer la secuencia de respuesta resultante y hacer cualquier otra cosa que necesite que hacer. Puede encontrar más información sobre la clase en:

http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.aspx

+1

Falta un punto y coma después de: string postData = "var = value1 & var2 = value2" –

0

He utilizado WebRequest para interactuar con sitios web. Es la 'herramienta' correcta

No puedo hacer un comentario sobre el aspecto JSON de su pregunta.

18

WebClient veces es más fácil de usar que WebRequest. Es posible que desee echarle un vistazo.

Para la deserialización JSON, querrá consultar la clase JavaScriptSerializer. ejemplo

cliente Web:

using (WebClient client = new WebClient()) 
{ 
    //manipulate request headers (optional) 
    client.Headers.Add (HttpRequestHeader.UserAgent, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"); 

    //execute request and read response as string to console 
    using (StreamReader reader = new StreamReader(client.OpenRead(targetUri))) 
    { 
     string s = reader.ReadToEnd(); 
     Console.WriteLine (s); 
    } 
} 

Marcado como wiki en caso de que alguien quiere actualizar el código

1

Cuando se trata de enviar un mensaje de datos a un sitio web, System.Net.HttpWebRequest (la implementación en HTTP específica de WebRequest) es una solución perfectamente decente. Es compatible con SSL, solicitudes asíncronas y un montón de otras cosas buenas, y está bien documentado en MSDN.

La carga útil puede ser cualquier cosa: datos en formato JSON o lo que sea, siempre que establezca la propiedad ContentType en algo que el servidor espera y comprende (probablemente application/json, text/json o text/x-json) , todo estará bien.

Un problema potencial cuando se utiliza HttpWebRequest desde un servicio del sistema: dado que utiliza el proxy IE y la información de credenciales, el comportamiento predeterminado puede ser un poco extraño cuando se ejecuta como el usuario LOCALSYSTEM (o básicamente cualquier cuenta que no inicie sesión interactivamente sobre una base regular). Establecer las propiedades de Proxy y Autenticación en Nothing (o, como su gente de C# prefiere llamarlo, null, creo) debería evitar eso.

0

Para convertir de instancia de objeto a formato JSON cadena y viceversa, probar Json.NET: http://json.codeplex.com/

actualmente lo estoy usando para un proyecto y es fácil de aprender y trabajar, y ofrece cierta flexibilidad en términos de serialización y convertidores de tipo personalizado. También es compatible con una sintaxis LINQ para consultar la entrada json.

Cuestiones relacionadas