Отправка HTTP POST с помощью System.Net.WebClient - PullRequest
31 голосов
/ 22 ноября 2011

Можно ли отправить HTTP POST с некоторыми данными формы с помощью System.Net.WebClient?

Если нет, есть ли другая библиотека, такая как WebClient, которая может выполнять HTTP POST?Я знаю, что могу использовать System.Net.HttpWebRequest, но я ищу что-то не столь многословное.

Надеюсь, это будет выглядеть так:

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

Ответы [ 3 ]

62 голосов
/ 22 ноября 2011

Основываясь на ответе @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.

14 голосов
/ 22 ноября 2011

WebClient не имеет прямой поддержки данных формы, но вы можете отправить сообщение HTTP, используя метод UploadString:

Using client as new WebClient
    result = client.UploadString(someurl, "param1=somevalue&param2=othervalue")
End Using
2 голосов
/ 22 ноября 2011

Что касается глагола 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() и записывать его как обычный поток, но я надеюсь, что это может помочь.

...