So veröffentlichen Sie Daten mit WebClient in C # an eine bestimmte URL

318

Ich muss "HTTP Post" mit WebClient verwenden, um einige Daten an eine bestimmte URL zu senden, die ich habe.

Jetzt weiß ich, dass dies mit WebRequest erreicht werden kann, aber aus bestimmten Gründen möchte ich stattdessen WebClient verwenden. Ist das möglich? Wenn ja, kann mir jemand ein Beispiel zeigen oder mich in die richtige Richtung weisen?

SolidSnake
quelle

Antworten:

373

Ich habe gerade die Lösung gefunden und ja, es war einfacher als ich dachte :)

Also hier ist die Lösung:

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

es funktioniert wie Charme :)

SolidSnake
quelle
28
Ein Trottel: Es ist besser, das HttpRequestHeader.ContentTypeAufzählungsmitglied hier wie folgt zu verwenden web.Headers[HttpRequestHeader.ContentType]: p
Alex
12
Ein weiterer Trottel, Sie sollten den Webclient ordnungsgemäß mit .dispose oder der "using" -Sprache entsorgen: using (WebClient wc = new WebClient ()) {// Ihr Code hier}
Mikey Hogarth
1
@RobinVanPersi Ich denke, ShikataGanai (Rafik bari) bedeutete, dass die andere Antwort ( stackoverflow.com/a/13061805/1160796 ) besser ist, weil sie die Codierung für Sie übernimmt.
Basher
3
@ alpsystems.com IDisposable-Objekte müssen vom Programmierer ordnungsgemäß entsorgt werden, entweder durch Umschließen in eine using oder durch explizites Aufrufen von .Dispose (). Garbage Collector kann nicht verwaltete Ressourcen wie
Dateihandler
1
Um die Erklärung von @ ccalboni zu erweitern. In einigen Fällen bereinigt der Garbage Collector nicht verwaltete Ressourcen und dergleichen, indem er den Destruktor aufruft (z. B. WebClienterbt von Component, der enthält ~Component() {Dispose(false);}). Das Problem besteht darin, dass der Garbage Collector möglicherweise eine beliebig lange Zeit benötigt, da er nicht verwaltete Ressourcen bei Sammlungsentscheidungen nicht berücksichtigt. Hochwertige Ressourcen müssen so schnell wie möglich bereinigt werden. Wenn Sie beispielsweise ein nicht benötigtes Dateihandle offen lassen, kann die Datei möglicherweise nicht gelöscht oder von anderem Code beschrieben werden.
Brian
360

Es gibt eine integrierte Methode namens UploadValues , die HTTP-POST (oder jede Art von HTTP-Methoden) senden UND die Erstellung des Anforderungshauptteils (Verketten von Parametern mit "&" und Escapezeichen von Zeichen durch URL-Codierung) im richtigen Formulardatenformat übernimmt:

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);
}
Endy Tjahjono
quelle
1
Was ist, wenn ich ein Modell an den Controller senden möchte? Kann ich weiterhin reqparm.Add (Zeichenfolge, Zeichenfolge) verwenden?
Burak Karakuş
6
@ BurakKarakuş meinst du, du willst JSON in den Körper schicken? Dann möchten Sie vielleicht WebClient.UploadString verwenden . Vergessen Sie nicht, Content-Type: application / json in den Header einzufügen.
Endy Tjahjono
@EndyTjahjono: Wie kann ich Optionsfeldwerte veröffentlichen? Angenommen, ich habe 3 Optionsfelder, die zur selben Gruppe gehören.
Asad Refai
Wie bekomme ich einen Antwortcode? Antwortheader? Muss ich die Antwort analysieren? Gibt es eine einfache Möglichkeit, das zu tun?
Jay Sullivan
WARNUNG . namevalueCollection erlaubt nicht den gleichen Schlüssel .das kann seltsame Begaiviour führen
bh_earth0
40

Mit WebClient.UploadStringoder können WebClient.UploadDataSie Daten einfach auf den Server POSTEN. Ich werde ein Beispiel mit UploadData zeigen, da UploadString auf die gleiche Weise wie DownloadString verwendet wird.

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

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

Pranay Rana
quelle
5
besser zu verwenden: client.Encoding = System.Text.UTF8Encoding.UTF8; Zeichenfolge varValue = Uri.EscapeDataString (Wert);
Yuriy Vikulov
23
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));
}
Andrew
quelle
21
//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());            
  }
}
TeJ
quelle
Die Verwendung der asynchronen Version ist gut. Alle oben genannten Versionen veröffentlichen und blockieren die Ausführung.
Juan
Entfernen Sie double __, um wc__UploadStringCompleted zu beheben
Joel Davis
1
Alle oben genannten Antworten funktionieren beim Testen gut, aber in einer realen Situation mit schlechtem Internet ist dies eine bessere Antwort.
Joel Davis
2

Die Verwendung von simple client.UploadString(adress, content);funktioniert normalerweise einwandfrei, aber ich denke, es sollte beachtet werden, dass a WebExceptionausgelöst wird, wenn kein erfolgreicher HTTP-Statuscode zurückgegeben wird. Normalerweise gehe ich so vor, um alle Ausnahmemeldungen zu drucken, die der Remote-Server zurückgibt:

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;
}
Ogglas
quelle
Danke, Ogglas. Ich habe viel Zeit damit verbracht, Fehler zu finden, und Ihr Code gibt mir weitere Informationen, die ich beheben kann.
Kate
1

Verwenden von webapiclient mit model send serialize json parameter request.

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

Business Caller-Methode

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

    }
Bora Karaca
quelle
0

Hier ist die klare Antwort:

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