web-dev-qa-db-fra.com

Comment publier des données sur une URL spécifique à l'aide de WebClient en C #

Je dois utiliser "HTTP Post" avec WebClient pour publier des données sur une URL spécifique que j'ai.

Maintenant, je sais que cela peut être accompli avec WebRequest, mais pour certaines raisons, je veux utiliser WebClient à la place. Est-ce possible? Si oui, quelqu'un peut-il me montrer un exemple ou me diriger dans la bonne direction?

296
SolidSnake

Je viens de trouver la solution et oui, c'était plus facile que je ne le pensais :)

alors voici la solution:

string URI = "http://www.myurl.com/post.php";
string myParameters = "param1=value1&param2=value2&param3=value3";

using (WebClient wc = new WebClient())
{
    wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
    string HtmlResult = wc.UploadString(URI, myParameters);
}

ça marche comme un charme :)

358
SolidSnake

Il existe une méthode intégrée appelée ploadValues pouvant envoyer HTTP POST (ou tout type de méthode HTTP) ET gère la construction du corps de la requête (concaténation des paramètres avec "&" et échappement caractères par codage d’URL) dans le format de données approprié:

using(WebClient client = new WebClient())
{
    var reqparm = new System.Collections.Specialized.NameValueCollection();
    reqparm.Add("param1", "<any> kinds & of = ? strings");
    reqparm.Add("param2", "escaping is already handled");
    byte[] responsebytes = client.UploadValues("http://localhost", "POST", reqparm);
    string responsebody = Encoding.UTF8.GetString(responsebytes);
}
343
Endy Tjahjono

En utilisant WebClient.UploadString ou WebClient.UploadData, vous pouvez POST transférer facilement des données au serveur. Je vais montrer un exemple en utilisant UploadData, puisque UploadString est utilisé de la même manière que DownloadString.

byte[] bret = client.UploadData("http://www.website.com/post.php", "POST",
                System.Text.Encoding.ASCII.GetBytes("field1=value1&amp;field2=value2") );

            string sret = System.Text.Encoding.ASCII.GetString(bret);

plus: http://www.daveamenta.com/2008-05/c-webclient-usage/

39
Pranay Rana
string URI = "site.com/mail.php";
using (WebClient client = new WebClient())
{
    System.Collections.Specialized.NameValueCollection postData = 
        new System.Collections.Specialized.NameValueCollection()
       {
              { "to", emailTo },  
              { "subject", currentSubject },
              { "body", currentBody }
       };
    string pagesource = Encoding.UTF8.GetString(client.UploadValues(URI, postData));
}
20
Andrew
//Making a POST request using WebClient.
Function()
{    
  WebClient wc = new WebClient();

  var URI = new Uri("http://your_uri_goes_here");

  //If any encoding is needed.
  wc.Headers["Content-Type"] = "application/x-www-form-urlencoded";
  //Or any other encoding type.

  //If any key needed

  wc.Headers["KEY"] = "Your_Key_Goes_Here";

  wc.UploadStringCompleted += 
      new UploadStringCompletedEventHandler(wc_UploadStringCompleted);

  wc.UploadStringAsync(URI,"POST","Data_To_Be_sent");    
}

void wc__UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)    
{  
  try            
  {          
     MessageBox.Show(e.Result); 
     //e.result fetches you the response against your POST request.         
  }
  catch(Exception exc)         
  {             
     MessageBox.Show(exc.ToString());            
  }
}
18
TeJ

L'utilisation de client.UploadString(adress, content); simple fonctionne normalement mais je pense qu'il faut se rappeler qu'un WebException sera lancé si aucun code d'état HTTP réussi n'est renvoyé. Je le gère généralement comme ceci pour imprimer tout message d'exception renvoyé par le serveur distant:

try
{
    postResult = client.UploadString(address, content);
}
catch (WebException ex)
{
    String responseFromServer = ex.Message.ToString() + " ";
    if (ex.Response != null)
    {
        using (WebResponse response = ex.Response)
        {
            Stream dataRs = response.GetResponseStream();
            using (StreamReader reader = new StreamReader(dataRs))
            {
                responseFromServer += reader.ReadToEnd();
                _log.Error("Server Response: " + responseFromServer);
            }
        }
    }
    throw;
}
1
Ogglas