Подтвердить что ты не робот

Как заполнить формы и отправить с помощью Webclient в С#

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

Мне нужно построить WinForm на основе С#, который может открыть 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; 

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

4b9b3361

Ответ 1

Вероятно, вам следует использовать 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();

Ответ 2

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

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 = System.Text.Encoding.UTF8.GetString(result);
}

Ответ 3

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

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

Ответ 4

Публикация формы с помощью 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();
}

Ответ 5

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

Ответ 6

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

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

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