2009-09-24 29 views
15

Ho visto così tante implementazioni di invio di un post http, e devo ammettere che non capisco perfettamente i dettagli sottostanti per sapere cosa è richiesto.Codice POST HTTP canonico?

Qual è il codice succinto/corretto/canonico per inviare un POST HTTP in C# .NET 3.5?

Voglio un metodo generico come

public string SendPost(string url, string data) 

che può essere aggiunto a una biblioteca e sempre utilizzato per la pubblicazione dei dati e restituirà la risposta del server.

risposta

10

Credo che la versione semplice di questo sarebbe

var client = new WebClient(); 
return client.UploadString(url, data); 

La classe System.Net.WebClient possiede altri metodi che consentono di scaricare o caricare le stringhe o un file, o byte.

Sfortunatamente ci sono (abbastanza spesso) situazioni in cui devi fare più lavoro. Quanto sopra, ad esempio, non si occupa delle situazioni in cui è necessario autenticarsi con un server proxy (sebbene utilizzi la configurazione proxy predefinita per IE).

Anche il WebClient non supporta il caricamento di più file o impostazione (alcuni specifici) intestazioni e, talvolta, si dovrà andare più a fondo e utilizzare il

System.Web.HttpWebRequest e System.Net.HttpWebResponse invece.

+0

+1 per WebClient.UploadString! per quanto riguarda le limitazioni di WebClient, c'è una soluzione facile, vedi la mia risposta –

+0

Una cosa comune che mi trovo a fare è postare xml su un webservice. UploadString è una buona opzione per questo scenario? E la codifica? è UTF-16? – User

+0

è possibile impostare la codifica su UFT-16 utilizzando la proprietà Encoding del WebClient. –

0

Confronta:

// create a client object 
using(System.Net.WebClient client = new System.Net.WebClient()) { 
    // performs an HTTP POST 
    client.UploadString(url, xml); 

} 

a

string HttpPost (string uri, string parameters) 
{ 
    // parameters: name1=value1&name2=value2 
    WebRequest webRequest = WebRequest.Create (uri); 
    webRequest.ContentType = "application/x-www-form-urlencoded"; 
    webRequest.Method = "POST"; 
    byte[] bytes = Encoding.ASCII.GetBytes (parameters); 
    Stream os = null; 
    try 
    { // send the Post 
     webRequest.ContentLength = bytes.Length; //Count bytes to send 
     os = webRequest.GetRequestStream(); 
     os.Write (bytes, 0, bytes.Length);   //Send it 
    } 
    catch (WebException ex) 
    { 
     MessageBox.Show (ex.Message, "HttpPost: Request error", 
     MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
    finally 
    { 
     if (os != null) 
     { 
     os.Close(); 
     } 
    } 

    try 
    { // get the response 
     WebResponse webResponse = webRequest.GetResponse(); 
     if (webResponse == null) 
     { return null; } 
     StreamReader sr = new StreamReader (webResponse.GetResponseStream()); 
     return sr.ReadToEnd().Trim(); 
    } 
    catch (WebException ex) 
    { 
     MessageBox.Show (ex.Message, "HttpPost: Response error", 
     MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
    return null; 
} // end HttpPost 

Perché le persone usano/scrittura quest'ultimo?

+3

In genere perché è necessario modificare effettivamente la richiesta oltre ciò che la classe WebClient consente, in particolare se si desidera modificare determinate intestazioni WebClient limita la possibilità di farlo, vedere http://msdn.microsoft.com/ it-us/library/system.net.webclient.headers.aspx – RobV

3

Come altri hanno già detto, WebClient.UploadString (o UploadData) è la strada da percorrere.

Tuttavia, lo WebClient integrato ha un grosso svantaggio: non si ha quasi alcun controllo sullo WebRequest utilizzato dietro la scena (cookie, autenticazione, intestazioni personalizzate ...). Un modo semplice per risolvere questo problema è creare il tuo WebClient personalizzato e sovrascrivere il metodo GetWebRequest. È quindi possibile personalizzare la richiesta prima che venga inviata (è possibile fare lo stesso per la risposta ignorando GetWebResponse). Ecco an example di un cookie WebClient. È così semplice che mi chiedo perché il WebClient integrato non lo gestisce immediatamente ...

+0

cool, grazie per il link! –