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?
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¶m2=value2¶m3=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 :)
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);
}
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&field2=value2") );
string sret = System.Text.Encoding.ASCII.GetString(bret);
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));
}
//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());
}
}
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;
}