35

Is it possible to send HTTP POST with some form data with System.Net.WebClient?

If not, is there another library like WebClient that can do HTTP POST? I know I can use System.Net.HttpWebRequest, but I'm looking for something that is not as verbose.

Hopefully it will look like this:

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

3 Answers 3

68

Based on @carlosfigueira 's answer, I looked further into WebClient's methods and found UploadValues, which is exactly what I want:

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

The key part is this:

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

It sends whatever verb I type in, and it also helps me create a properly url encoded form data, I just have to supply the parameters as a namevaluecollection.

Sign up to request clarification or add additional context in comments.

4 Comments

What does someUrl refer to?? I'm trying to log in to a website that has a HTML login-form, it doesn't login. The resulted data is as if I'm anonymous.
@Shimmy I haven't tried using webclient on a site that requires login. someUrl is URL string, for example client.UploadValues("http://localhost", "POST", reqparm).
can we use this POST request (including the parameters call) with the asynchronous call?
It's working fine, thanks for the answer! But when I call Net.WebClient.UploadValues method it's start 7 threads and don't stop these. What could I do about this?
14

WebClient doesn't have a direct support for form data, but you can send a HTTP post by using the UploadString method:

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

7 Comments

POST - that's the default for UploadString. You can also pass the HTTP verb as an optional third parameter.
I guess the form data needs to be escaped: "param1=" & HttpUtility.UrlEncode("somevalue")
If the value needs to be escaped, yes. "somevalue" doesn't. As I mentioned, WebClient itself doesn't have any form support, you need to create the string yourself.
Based on your answer, I found UploadValues. Thanks!
Interesting, I didn't know that. Thanks for sharing it :)
|
2

As far as the http verb is concerned the WebRequest might be easier. You could go for something like:

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

Obviously this lacks exception handling and writing the request body (for which you can use r.GetRequestStream() and write it like a regular stream, but I hope it may be of some help.

1 Comment

question has tag vb.net

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.