Как заполнить формы и отправить с Webclient в C # - PullRequest
27 голосов
/ 27 апреля 2009

Я новичок в использовании библиотек WebClient, HttpResponse и HttpRequest в C #, так что терпите меня, если мой вопрос сбивает с толку.

Мне нужно создать WinForm на основе C #, который может открывать URL, который защищен базовой авторизацией. Я сделал это с добавлением этого в шапку, например:

using (WebClient wc = new WebClient())
{
    wc.Headers.Add(HttpRequestHeader.Authorization, "Basic " +
    Convert.ToBase64String(
    Encoding.ASCII.GetBytes(username + ":" + password)));
}

Пока все хорошо! Теперь я хотел бы заполнить форму с номером, и я нахожу исходный код с сайта, и обнаружил, что имя «число». Поэтому я пишу это:

NameValueCollection formData = new NameValueCollection();  
formData["number"] = number
byte[] responseBytes = wc.UploadValues(theurl, "POST", formData);
string response = Encoding.ASCII.GetString(responseBytes);
textBox_HTML.Text = response; 

Но как мне отправить это? Я хотел бы получить мои "результаты поиска" ...

Ответы [ 6 ]

48 голосов
/ 27 апреля 2009

Вероятно, вы должны использовать HttpWebRequest для этого. Вот простой пример:

var strId = UserId_TextBox.Text;
var strName = Name_TextBox.Text;

var encoding=new ASCIIEncoding();
var postData="userid="+strId;
postData += ("&username="+strName);
byte[]  data = encoding.GetBytes(postData);

var myRequest =
  (HttpWebRequest)WebRequest.Create("http://localhost/MyIdentity/Default.aspx");
myRequest.Method = "POST";
myRequest.ContentType="application/x-www-form-urlencoded";
myRequest.ContentLength = data.Length;
var newStream=myRequest.GetRequestStream();
newStream.Write(data,0,data.Length);
newStream.Close();

var response = myRequest.GetResponse();
var responseStream = response.GetResponseStream();
var responseReader = new StreamReader(responseStream);
var result = responseReader.ReadToEnd();

responseReader.Close();
response.Close();
37 голосов
/ 27 апреля 2012

Попробуйте это:

using System.Net;
using System.Collections.Specialized;  

NameValueCollection values = new NameValueCollection();
values.Add("TextBox1", "value1");
values.Add("TextBox2", "value2");
values.Add("TextBox3", "value3");
string Url = urlvalue.ToLower();

using (WebClient client = new WebClient())
{
    client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
    byte[] result = client.UploadValues(Url, "POST", values);
    string ResultAuthTicket = Encoding.UTF8.GetString(result);
}
3 голосов
/ 29 апреля 2009

Я нашел решение своей проблемы. Прежде всего меня смутили некоторые основы http-коммуникации. Это было вызвано написанным мной python-скриптом, который по-другому подходил к коммуникации.

Я решил это с помощью генерации POST-данных с нуля и открытия uri, который содержался в форме действия.

1 голос
/ 19 апреля 2015

Отправка формы с помощью System.Net.Http.HttpClient и чтение ответа в виде строки:

var formData = new Dictionary<string, string>();
formData.Add("number", number);

var content = new FormUrlEncodedContent(formData);

using (var httpClient = new HttpClient())
{
    var httpResponse = await httpClient.PostAsync(theurl, content);

    var responseString = await httpResponse.Content.ReadAsStringAsync();
}
0 голосов
/ 07 ноября 2011

BFree ответ отлично работает. Однако я хотел бы отметить одну вещь: конкатенация данных должна действительно кодироваться по URL, иначе у вас возникнут проблемы с такими вещами, как «=» и «&» в данных.

Ниже приведена версия VB.NET с кодировкой urlen и поддержкой UTF-8 (обратите внимание, что для кодирования URL требуется ссылка на System.Web.dll, которая сработала только после перехода с .NET 4 Compact Framework на обычный .NET 4 Framework).

Imports System.Web
Imports System.Net
Imports System.IO

Public Class WebFormSubmitter

    Public Shared Function submit(ByVal address As String,
                                  ByVal values As Dictionary(Of String, String)) As String
        Dim encoding As New UTF8Encoding
        Dim postData As String = getPostData(values:=values)
        Dim data() As Byte = encoding.GetBytes(postData)

        Dim request = CType(WebRequest.Create(address), HttpWebRequest)
        request.Method = "POST"
        request.ContentType = "application/x-www-form-urlencoded"
        request.ContentLength = data.Length
        Dim newStream = request.GetRequestStream()
        newStream.Write(data, 0, data.Length)
        newStream.Close()

        Dim response = request.GetResponse()
        Dim responseStream = response.GetResponseStream()
        Dim responseReader = New StreamReader(responseStream)
        Return responseReader.ReadToEnd()
    End Function

    Private Shared Function getPostData(ByVal values As Dictionary(Of String, String)) As String
        Dim postDataPairList As New List(Of String)
        For Each anEntry In values
            postDataPairList.Add(anEntry.Key & "=" & HttpUtility.UrlEncode(anEntry.Value))
        Next
        Return String.Join(separator:="&", values:=postDataPairList)
    End Function

End Class
0 голосов
/ 27 апреля 2009

Вы уже отправили его с UploadValues. Вопрос в том, каков ваш «поиск результатов»? Что возвращает страница? HTML? Если это так - HTML Agility Pack - это самый простой способ анализа html.

...