2011-11-22 11 views
26

È possibile inviare HTTP POST con alcuni dati di modulo con System.Net.WebClient?Invio di POST HTTP con System.Net.WebClient

In caso contrario, esiste un'altra libreria come WebClient che può eseguire HTTP POST? So che posso usare System.Net.HttpWebRequest, ma sto cercando qualcosa che non sia così dettagliato.

Speriamo che sarà simile a questa:

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

risposta

54

Sulla base della risposta di @carlosfigueira, ho esaminato ulteriormente i metodi di WebClient e ho trovato UploadValues, che è esattamente quello che voglio:

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 fondamentale è questo:

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

Si invia qualsiasi verbo digito, e aiuta anche a me creare un dati del modulo correttamente URL codificato, non mi resta che fornire i parametri come NameValueCollection.

+0

A cosa si riferisce 'someUrl' ?? Sto cercando di accedere a un sito Web che ha un modulo di accesso HTML, non effettua il login. I dati risultanti sono come se fossi anonimo. – Shimmy

+0

@Shimmy Non ho provato ad usare webclient su un sito che richiede il login. 'someUrl' è una stringa URL, ad esempio' client.UploadValues ​​("http: // localhost", "POST", reqparm) '. –

+0

possiamo usare questa richiesta POST (compresa la chiamata ai parametri) con la chiamata asincrona? – gumuruh

13

WebClient non hai il supporto diretto per i dati dei moduli, ma è possibile inviare un post HTTP utilizzando il metodo UploadString:

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

Ma il server leggerà la richiesta come "GET" o "POST"? –

+1

POST - questo è il valore predefinito per "UploadString" .Puoi anche passare il verbo HTTP come terzo parametro opzionale – carlosfigueira

+2

Suppongo che i dati del modulo debbano essere sfuggito: '" param1 = "& HttpUtility.UrlEncode (" somevalue ")' –

2

Per quanto riguarda il verbo http, il WebRequest potrebbe essere più semplice. Si potrebbe andare per qualcosa di simile:

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(); 
     } 
    } 

Ovviamente questo manca la gestione delle eccezioni e scrivere il corpo della richiesta (per il quale è possibile utilizzare r.GetRequestStream() e scrivere come un flusso regolare, ma spero che possa essere di qualche aiuto

.