Як розмістити дані за певною URL-адресою за допомогою WebClient у C #


319

Мені потрібно використовувати "HTTP Post" з WebClient, щоб розмістити деякі дані за певною URL-адресою.

Тепер я знаю, що це може бути досягнуто за допомогою WebRequest, але я чомусь хочу використовувати WebClient. Це можливо? Якщо так, чи може хтось показати мені якийсь приклад чи вказати мені в правильному напрямку?

Відповіді:


374

Я просто знайшов рішення, і так було легше, ніж я думав :)

тому ось рішення:

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

це працює як шарм :)


28
Nitpick: тут краще використовувати HttpRequestHeader.ContentTypeчлен перерахунку так web.Headers[HttpRequestHeader.ContentType]: p
Олексій

12
Інший чіплятися, ви повинні позбавитися від WebClient належним використанням .dispose або « з допомогою» ідіома: використання (WebClient туалет = новий WebClient ()) {// тут ваш код}
Mikey Хогарт

1
@RobinVanPersi Я думаю, що ShikataGanai (Рафік барі) означав, що інша відповідь ( stackoverflow.com/a/13061805/1160796 ) краща, оскільки вона обробляє кодування для вас.
башер

3
@ alpsystems.com Ідентифіковані об'єкти повинні бути належним чином розміщені програмістом, або шляхом загортання в користування, або шляхом явного виклику. Збирач сміття не може відслідковувати керовані ресурси, як-от обробники файлів, підключення до бази даних тощо
ccalboni

1
Щоб продовжити @ ccalboni пояснення. У деяких випадках збирач сміття очищатиме некеровані ресурси тощо, викликаючи деструктор (наприклад, WebClientуспадковує Component, який містить ~Component() {Dispose(false);}). Проблема полягає в тому, що для збору сміття це може зайняти довільно довгий час, оскільки він не враховує некеровані ресурси під час прийняття рішень щодо збору. Високоцінні ресурси повинні бути очищені якнайшвидше. Наприклад, залишити відкритою непотрібну ручку файлу може заблокувати видалення файлу або запис на нього за допомогою іншого коду.
Брайан

361

Існує вбудований метод під назвою UploadValues, який може надсилати HTTP POST (або будь-який тип HTTP-методів) І обробляє побудову тіла запиту (об'єднуючи параметри з "&" та виходять символи кодуванням url) у відповідному форматі даних:

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
Що робити, якщо я хочу розмістити модель на контролері? Чи можу я все-таки використовувати reqparm.Add (рядок, рядок)?
Бурак Каракуш

6
@ BurakKarakuş, ти маєш на увазі, що хочеш відправити JSON в тіло? Тоді ви можете скористатися WebClient.UploadString . Не забудьте додати до заголовка Content-Type: application / json.
Endy Tjahjono

@EndyTjahjono: Як я можу розміщувати значення перемикача. Припустимо, у мене 3 перемикачі належать до однієї групи.
Асад Рефай

Як отримати код відповіді? Заголовки відповідей? Чи потрібно аналізувати відповідь? Чи є простий спосіб це зробити?
Джей Салліван

УВАГА . namevalueCollection donest дозволяють той же ключ .thus може призвести до дивного begaiviour
bh_earth0

40

Використання WebClient.UploadStringабо WebClient.UploadDataви можете легко розмістити дані на сервері. Я покажу приклад використання UploadData, оскільки UploadString використовується так само, як і 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);

більше: http://www.daveamenta.com/2008-05/c-webclient-usage/


5
краще використовувати: client.Encoding = System.Text.UTF8Encoding.UTF8; рядок varValue = Uri.EscapeDataString (значення);
Юрій Вікулов

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

Використання версії async є хорошою, все вищезазначене публікує та блокує виконання.
Хуан

видалити подвійний __, щоб виправити wc__UploadStringCompleted
Джоел Девіс

1
Усі вищезазначені відповіді будуть добре працювати в тестуванні, але в реальній життєвій ситуації з поганим Інтернетом це краща відповідь.
Джоель Девіс

2

Використання простих client.UploadString(adress, content);нормально працює добре, але я думаю, слід пам’ятати, що WebExceptionбуде видано, якщо не повернеться успішний код статусу HTTP. Я зазвичай обробляю це так, щоб надрукувати будь-яке повідомлення про виключення, на якому віддалений сервер повертається:

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

Використовуючи webapiclient з моделлю, надішліть запит на параметр serialize 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);
        }
    }
}

Метод ділових абонентів

    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

Ось чітка відповідь:

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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.