C # 'de WebClient kullanarak belirli bir URL'ye veri gönderme


319

Ben sahip belirli bir URL bazı veri göndermek için "HTTP Post" WebClient ile kullanmanız gerekir.

Şimdi, bunun WebRequest ile gerçekleştirilebileceğini biliyorum ama bazı nedenlerden dolayı bunun yerine WebClient kullanmak istiyorum. Mümkün mü? Eğer öyleyse, birisi bana bir örnek gösterebilir veya beni doğru yöne yönlendirebilir mi?

Yanıtlar:


374

Çözümü buldum ve evet düşündüğümden daha kolaydı :)

işte çözüm:

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

çekicilik gibi çalışır :)


28
Bir nitpick: HttpRequestHeader.ContentTypenumaralandırma üyesini burada böyle kullanmak daha iyidir web.Headers[HttpRequestHeader.ContentType]: p
Alex

12
Başka bir nitpick, web istemcisini .dispose veya "using" deyimini kullanarak düzgün bir şekilde atmalısınız: using (WebClient wc = new WebClient ()) {// burada kodunuz}
Mikey Hogarth

1
@RobinVanPersi Sanırım ShikataGanai (Rafik bari) diğer cevabın ( stackoverflow.com/a/13061805/1160796 ) daha iyi olduğunu ifade etti çünkü kodlamayı sizin için hallediyor .
basher

3
@ alpsystems.com IDis atılabilir nesneler, bir programın içine sarılarak veya .Dispose () yöntemini açıkça çağırarak programcı tarafından uygun şekilde atılmalıdır. Çöp toplayıcı, dosya işleyicileri, veritabanı bağlantıları ve benzeri gibi yönetilmeyen kaynakları izleyemez
ccalboni

1
@ Ccalboni'nin açıklamasını genişletmek için. Bazı durumlarda çöp toplayıcı, yıkıcıyı çağırarak yönetilmeyen kaynakları ve benzerlerini temizler (örneğin, içerdiği WebClientmiras ). Sorun, çöp toplayıcısının toplama kararları verirken yönetilmeyen kaynakları hesaba katmadığından, keyfi olarak uzun zaman alabilmesidir. Yüksek değerli kaynaklar mümkün olan en kısa sürede temizlenmelidir. Örneğin, gereksiz bir dosya tanıtıcısını açık bırakmak dosyanın silinmesini veya başka bir kod tarafından yazılmasını engelleyebilir. Component~Component() {Dispose(false);}
Brian

361

HTTP POST (veya herhangi bir HTTP yöntemi) gönderebilen VE istek gövdesinin oluşturulmasını ("&" ile parametreleri birleştirerek ve url kodlaması ile karakterlerden kaçış) uygun form veri biçiminde işleyebilen UploadValues adlı yerleşik bir yöntem vardır :

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

1
Denetleyiciye bir model göndermek istersem ne olur? Yine de reqparm.Add (string, string) kullanabilir miyim?
Burak Karakuş

6
@ BurakKarakuş demek istiyorsun bedeninizi JSON'a göndermek istiyor musunuz? Sonra WebClient.UploadString kullanmak isteyebilirsiniz . Başlığa Content-Type: application / json eklemeyi unutmayın.
Endy Tjahjono

@EndyTjahjono: Radyo düğmesi değerlerini nasıl gönderebilirim? Aynı gruba ait 3 radyo düğmem olduğunu varsayalım.
Asad Refai

Yanıt kodunu nasıl alabilirim? Yanıt başlıkları? Cevabı ayrıştırmam gerekiyor mu? Bunu yapmanın kolay bir yolu var mı?
Jay Sullivan

UYARI. Toplama donest aynı anahtarı izin verir. bu garip begaiviour yol açabilir
bh_earth0

40

WebClient.UploadStringVeya kullanarak WebClient.UploadDataverileri sunucuya kolayca POST yapabilirsiniz. UploadString'i DownloadString ile aynı şekilde kullanıldığı için UploadData kullanarak bir örnek göstereceğim.

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

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


5
kullanımı daha iyi: client.Encoding = System.Text.UTF8Encoding.UTF8; string varValue = Uri.EscapeDataString (value);
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));
}

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

Zaman uyumsuz sürümü kullanmak, yukarıdakilerin tümü yürütmeyi gönderir ve engeller.
Juan

wc__UploadStringCompleted düzeltmek için çift __ kaldırmak
Joel Davis

1
Yukarıdaki tüm cevaplar testte iyi çalışacaktır, ancak zayıf internet ile gerçek bir yaşam durumunda bu daha iyi bir cevaptır.
Joel Davis

2

Basit kullanmak client.UploadString(adress, content);normalde iyi çalışıyor ama WebExceptionbir HTTP başarılı durum kodu döndürülmezse atılır hatırlanması gerektiğini düşünüyorum . Genellikle uzak sunucunun döndürdüğü herhangi bir istisna mesajı yazdırmak için böyle işlemek:

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

teşekkür ederim Ogglas. Hata bulmak için çok zaman harcadım ve kodunuz düzeltmem için daha fazla bilgi veriyor.
Kate

1

Model gönderme webapiclient kullanarak serialize json parametre isteği.

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

İşletme arayan yöntemi

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

    }

0

İşte net cevap:

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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.