2011-11-22 51 views
26

¿Es posible enviar HTTP POST con algunos datos de formulario con System.Net.WebClient?Enviando HTTP POST con System.Net.WebClient

Si no, ¿hay otra biblioteca como WebClient que pueda hacer HTTP POST? Sé que puedo usar System.Net.HttpWebRequest, pero estoy buscando algo que no sea tan detallado.

Es de esperar que el siguiente aspecto:

Using client As New TheHTTPLib 
    client.FormData("parm1") = "somevalue" 
    result = client.DownloadString(someurl, Method.POST) 
End Using 

Respuesta

54

Basado en la respuesta de @carlosfigueira, investigué más a fondo los métodos de WebClient y encontré UploadValues, que es exactamente lo que quiero:

Using client As New Net.WebClient 
    Dim reqparm As New Specialized.NameValueCollection 
    reqparm.Add("param1", "somevalue") 
    reqparm.Add("param2", "othervalue") 
    Dim responsebytes = client.UploadValues(someurl, "POST", reqparm) 
    Dim responsebody = (New Text.UTF8Encoding).GetString(responsebytes) 
End Using 

La parte clave es la siguiente:

client.UploadValues(someurl, "POST", reqparm) 

envía cualquier verbo de tipo I, y también me ayuda a crear un formulario de datos codificados adecuadamente URL, sólo tengo que suministrar los parámetros como NameValueCollection.

+0

¿A qué se refiere 'someUrl'? Estoy intentando iniciar sesión en un sitio web que tiene un formulario de inicio de sesión HTML, no inicia sesión. Los datos resultantes son como si fuera anónimo. – Shimmy

+0

@Shimmy No he intentado usar webclient en un sitio que requiere iniciar sesión. 'someUrl' es cadena URL, por ejemplo' client.UploadValues ​​("http: // localhost", "POST", reqparm) '. –

+0

¿podemos utilizar esta solicitud POST (incluida la llamada a los parámetros) con la llamada asíncrona? – gumuruh

13

WebClient no tiene un apoyo directo a los datos del formulario, pero se puede enviar un mensaje HTTP utilizando el método UploadString:

Using client as new WebClient 
    result = client.UploadString(someurl, "param1=somevalue&param2=othervalue") 
End Using 
+0

¿Pero el servidor leerá la solicitud como 'OBTENER' o 'POST'? –

+1

POST - es el valor predeterminado para 'UploadString'. También puede pasar el verbo HTTP como un tercer parámetro opcional. – carlosfigueira

+2

Supongo que los datos del formulario deben escaparse: '" param1 = "& HttpUtility.UrlEncode (" somevalue ")' –

2

En lo que respecta al verbo http, el WebRequest podría ser más fácil. Usted podría ir para algo como:

WebRequest r = WebRequest.Create("http://some.url"); 
    r.Method = "POST"; 
    using (var s = r.GetResponse().GetResponseStream()) 
    { 
     using (var reader = new StreamReader(r, FileMode.Open)) 
     { 
      var content = reader.ReadToEnd(); 
     } 
    } 

Obviamente, esto carece de manejo de excepciones y escribir el cuerpo de la petición (para lo cual se puede utilizar r.GetRequestStream() y escribirlo como un flujo regular, pero espero que pueda ser de alguna ayuda

.