Cum se postează date la un URL specific utilizând WebClient în C# (Programare, C#, Posta, Webclient)

SolidSnake a intrebat.

Am nevoie să folosesc „HTTP Post” cu WebClient pentru a posta niște date la un URL specific pe care îl am.

Acum, știu că acest lucru poate fi realizat cu WebRequest, dar din anumite motive vreau să folosesc în schimb WebClient. Este posibil acest lucru? Dacă da, poate cineva să-mi arate un exemplu sau să-mi indice direcția corectă?

8 răspunsuri
SolidSnake

Tocmai am găsit soluția și da, a fost mai ușor decât am crezut 🙂

așa că aici este soluția:

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

funcționează ca un farmec 🙂

Comentarii

    29

  • Un nitpick: este mai bine să folosiți HttpRequestHeader.ContentType enumeration member aici, astfel web.Headers[HttpRequestHeader.ContentType] :p –  > Por Alex.
  • O altă greșeală, ar trebui să elimini clientul web în mod corespunzător folosind .dispose sau idiomul „using”: using (WebClient wc = new WebClient()) { //codul tău aici } –  > Por Mikey Hogarth.
  • @RobinVanPersi Cred că ShikataGanai (Rafik bari) a vrut să spună că celălalt răspuns (stackoverflow.com/a/13061805/1160796) este mai bun, deoarece se ocupă de codificare pentru dvs. –  > Por basher.
  • @alpsystems.com Obiectele IDisposable trebuie să fie eliminate în mod corespunzător de către programator, fie prin înglobarea într-un using, fie prin invocarea explicită a lui .Dispose(). Colectorul de gunoi nu poate urmări resursele neadministrate, cum ar fi gestionarii de fișiere, conexiunile la baze de date și așa mai departe –  > Por ccalboni.
  • Pentru a extinde explicația lui @ccalboni. În unele cazuri, garbage collector va curăța resursele negestionate și altele asemenea prin apelarea destructorului (de ex, WebClient moștenește din Component, , care conține ~Component() {Dispose(false);}). Problema este că garbage collector poate dura arbitrar de mult timp pentru a face acest lucru, deoarece nu ia în considerare resursele negestionate atunci când ia decizii de colectare. Resursele de mare valoare trebuie să fie curățate cât mai repede posibil. De exemplu, dacă se lasă deschis un mâner de fișier inutilizat, se poate bloca ștergerea sau scrierea fișierului de către alt cod. –  > Por Brian.
Endy Tjahjono

Există o metodă încorporată numită UploadValues care poate trimite HTTP POST (sau orice fel de metode HTTP) ȘI se ocupă de construcția corpului cererii (concatenarea parametrilor cu „&” și scăparea caracterelor prin codificarea url) în formatul de date corespunzător:

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

Comentarii

  • Ce se întâmplă dacă vreau să postez un model în controler? Pot să mai folosesc reqparm.Add(string, string)? –  > Por Burak Karakuș.
  • @BurakKarakuș vrei să spui că vrei să trimiți JSON în corp? Atunci este posibil să doriți să utilizați WebClient.UploadString. Nu uitați să adăugați Content-Type: application/json în antet. –  > Por Endy Tjahjono.
  • @EndyTjahjono : Cum pot posta valorile butoanelor radio. Să presupunem că am 3 butoane radio care aparțin aceluiași grup. –  > Por Asad Refai.
  • Cum pot obține codul de răspuns? Capetele de răspuns? Trebuie să analizez răspunsul? Există o modalitate ușoară de a face acest lucru? –  > Por Jay Sullivan.
  • WARNİNG . namevalueCollection nu permite aceeași cheie .astfel poate duce la un comportament ciudat –  > Por bh_earth0.
Pranay Rana

Utilizarea WebClient.UploadString sau WebClient.UploadData puteți posta cu ușurință date către server. Voi arăta un exemplu folosind UploadData, deoarece UploadString este utilizat în același mod ca și 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);

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

Comentarii

  • mai bine să folosiți: client.Encoding = System.Text.UTF8Encoding.UTF8; string varValue = Uri.EscapeDataString(value); –  > Por Yuriy Vikulov.
Andrew
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));
}

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

Comentarii

  • Folosirea versiunii async este una bună, toate cele de mai sus postează și blochează execuția. –  > Por Juan.
  • eliminați dublul __ pentru a repara wc__UploadStringCompleted –  > Por Joel Davis.
  • Toate răspunsurile de mai sus vor funcționa bine în teste, dar într-o situație reală, cu internet slab, acesta este un răspuns mai bun. –  > Por Joel Davis.
Ogglas

Folosind simplu client.UploadString(adress, content); în mod normal funcționează bine, dar cred că ar trebui să ne amintim că un WebException va fi aruncat dacă nu este returnat un cod de stare HTTP de succes. De obicei, mă ocup așa pentru a imprima orice mesaj de excepție pe care serverul la distanță îl returnează:

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

Comentarii

  • Mulțumesc, Ogglas. Am petrecut mult timp pentru a găsi eroarea și codul dvs. îmi oferă mai multe informații pentru a rezolva. –  > Por Kate.
Bora Karaca

Folosind webapiclient cu model trimiteți cerere de serializare a parametrilor json.

PostModel.cs

    public string Id { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public int Age { get; set; }

WebApiClient.cs

internal class WebApiClient  : IDisposable
  {

    private bool _isDispose;

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    public void Dispose(bool disposing)
    {
        if (!_isDispose)
        {

            if (disposing)
            {

            }
        }

        _isDispose = true;
    }

    private void SetHeaderParameters(WebClient client)
    {
        client.Headers.Clear();
        client.Headers.Add("Content-Type", "application/json");
        client.Encoding = Encoding.UTF8;
    }

    public async Task<T> PostJsonWithModelAsync<T>(string address, string data,)
    {
        using (var client = new WebClient())
        {
            SetHeaderParameters(client);
            string result = await client.UploadStringTaskAsync(address, data); //  method:
    //The HTTP method used to send the file to the resource. If null, the default is  POST 
            return JsonConvert.DeserializeObject<T>(result);
        }
    }
}

Metoda Business caller

    public async Task<ResultDTO> GetResultAsync(PostModel model)
    {
        try
        {
            using (var client = new WebApiClient())
            {
                var serializeModel= JsonConvert.SerializeObject(model);// using Newtonsoft.Json;
                var response = await client.PostJsonWithModelAsync<ResultDTO>("http://www.website.com/api/create", serializeModel);
                return response;
            }
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }

    }

KayV

Aici este răspunsul clar:

public String sendSMS(String phone, String token) {
    WebClient webClient = WebClient.create(smsServiceUrl);

    SMSRequest smsRequest = new SMSRequest();
    smsRequest.setMessage(token);
    smsRequest.setPhoneNo(phone);
    smsRequest.setTokenId(smsServiceTokenId);

    Mono<String> response = webClient.post()
          .uri(smsServiceEndpoint)
          .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
          .body(Mono.just(smsRequest), SMSRequest.class)
          .retrieve().bodyToMono(String.class);

    String deliveryResponse = response.block();
    if (deliveryResponse.equalsIgnoreCase("success")) {
      return deliveryResponse;
    }
    return null;
}