2011-11-22 159 views
26

是否可以使用System.Net.WebClient发送带有某些表单数据的HTTP POST?使用System.Net.WebClient发送HTTP POST

如果没有,是否有另一个类似WebClient的库可以执行HTTP POST?我知道我可以使用System.Net.HttpWebRequest,但我正在寻找不那么冗长的东西。

希望这将是这样的:

Using client As New TheHTTPLib 
    client.FormData("parm1") = "somevalue" 
    result = client.DownloadString(someurl, Method.POST) 
End Using 

回答

54

基于@ carlosfigueira的回答,我进一步研究了WebClient的方法,发现UploadValues,这正是我想要的:

Using client As New Net.WebClient 
    Dim reqparm As New Specialized.NameValueCollection 
    reqparm.Add("param1", "somevalue") 
    reqparm.Add("param2", "othervalue") 
    Dim responsebytes = client.UploadValues(someurl, "POST", reqparm) 
    Dim responsebody = (New Text.UTF8Encoding).GetString(responsebytes) 
End Using 

的关键部分是这样的:

client.UploadValues(someurl, "POST", reqparm) 

它发出的任何动词我输入,也可以帮助我建立一个正确的URL编码形式的数据,我只是作为一个NameValueCollection中提供的参数。

+0

'someUrl'是指什么?我试图登录到一个拥有HTML登录表单的网站,但它不会登录。结果数据就好像我是匿名的。 – Shimmy

+0

@Shimmy我还没有尝试在需要登录的网站上使用webclient。 'someUrl'是URL字符串,例如'client.UploadValues(“http:// localhost”,“POST”,reqparm)'。 –

+0

我们可以使用此POST请求(包括参数调用)与异步调用吗? – gumuruh

13

WebClient不具有表单数据的直接支持,但您可以通过使用UploadString方法来发送HTTP发布:

Using client as new WebClient 
    result = client.UploadString(someurl, "param1=somevalue&param2=othervalue") 
End Using 
+0

但服务器是否会将请求读取为'GET'或'POST'? –

+1

POST - 这是'UploadString'的默认值。您也可以将HTTP动词作为可选的第三个参数传递。 – carlosfigueira

+2

我猜表单数据需要被转义:'“param1 =”&HttpUtility.UrlEncode(“somevalue”)' –

2

就http动词而言,WebRequest可能更容易。你可以去的东西,如:

WebRequest r = WebRequest.Create("http://some.url"); 
    r.Method = "POST"; 
    using (var s = r.GetResponse().GetResponseStream()) 
    { 
     using (var reader = new StreamReader(r, FileMode.Open)) 
     { 
      var content = reader.ReadToEnd(); 
     } 
    } 

显然,这没有异常处理和写入请求主体(您可以用r.GetRequestStream()并把它写像一个普通的流,但我希望这是一些帮助