如何在C#中使用WebClient将数据发布到特定的URL


319

我需要对WebClient使用“ HTTP Post”将一些数据发布到我拥有的特定URL。

现在,我知道可以使用WebRequest完成此操作,但是由于某些原因,我想改用WebClient。那可能吗?如果是这样,有人可以向我展示一些例子或为我指出正确的方向吗?

Answers:


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
一个小问题:最好在HttpRequestHeader.ContentType这里使用枚举成员web.Headers[HttpRequestHeader.ContentType]:p
Alex

12
另一个nitpick,您应该使用.dispose或“ using”惯用语正确处置Web客户端:using(WebClient wc = new WebClient()){//此处是您的代码}
Mikey Hogarth 2012年

1
@RobinVanPersi我认为ShikataGanai(Rafik bari)的意思是其他答案(stackoverflow.com/a/13061805/1160796)更好,因为它可以为您处理编码。
basher 2014年

3
@ alpsystems.com IDisposable对象需要由程序员适当地处置,方法是包装在using中或显式调用.Dispose()。垃圾收集器无法跟踪非托管资源,例如文件处理程序,数据库连接等
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(string,string)吗?
BurakKarakuş15年

6
@BurakKarakuş您是说要在体内发送JSON吗?然后,您可能要使用WebClient.UploadString。不要忘记在标题中添加Content-Type:application / json。
Endy Tjahjono 2015年

@EndyTjahjono:如何发布单选按钮值。假设我有3个单选按钮属于同一组。
Asad Refai 2015年

如何获得响应码?响应头?我是否必须解析响应?有没有简单的方法可以做到这一点?
杰·沙利文

警告 。namevalueCollection Donest允许使用相同的密钥。因此可能导致奇怪的行为
bh_earth0

40

使用WebClient.UploadStringWebClient.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(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());            
  }
}

使用异步版本是一个不错的选择,以上所有功能都可以发布并阻止执行。
2015年

删除双__以修复wc__UploadStringCompleted
Joel Davis

1
以上所有答案在测试中都可以正常工作,但是在现实生活中互联网不佳的情况下,这是一个更好的答案。
乔尔·戴维斯

2

使用简单client.UploadString(adress, content);通常可以正常工作,但我认为应该记住,WebException如果未返回HTTP成功状态代码,则将抛出a。我通常这样处理,以打印远程服务器返回的任何异常消息:

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与模型一起使用发送序列化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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.