web-dev-qa-db-fra.com

Comment remplir des formulaires et les envoyer avec Webclient en C #

Je suis novice dans l’utilisation des bibliothèques WebClient, HttpResponse et HttpRequest en C #, alors supportez-moi, si ma question est difficile à lire.

Je dois construire un WinForm basé sur C # pouvant ouvrir une URL sécurisée avec l'autorisation de base. Je l'ai fait en ajoutant ceci à l'en-tête, comme ceci:

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

Jusqu'ici tout va bien! Maintenant, je voudrais remplir un formulaire avec un numéro, et je trouve le code source du site, et découvre que le nom est "numéro". Alors j'écris ceci:

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

Mais comment puis-je soumettre cela? J'aimerai recevoir mes "résultats de recherche" ...

27
Soren Mikkelsen

Vous devriez probablement utiliser HttpWebRequest pour cela. Voici un exemple simple:

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();
48
BFree

Essaye ça:

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);
}
36
mrlingam

J'ai trouvé une solution à mon problème. Tout d’abord, je ne comprenais pas certains des principes de base de la communication http. Cela a été causé par un script python que j'ai écrit, qui a une approche différente de la communication.

Je l'ai résolu en générant les données POST à ​​partir de zéro et en ouvrant l'URI, qui était contenu dans le formulaire-action.

3
Soren Mikkelsen

Publier un formulaire avec System.Net.Http.HttpClient et lire la réponse sous forme de chaîne:

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

La réponse de BFree fonctionne très bien. Une chose que je voudrais noter, cependant, est que la concaténation de données devrait vraiment être encodée en url, sinon vous auriez des problèmes avec des signes comme "=" et "&" dans les données.

La version VB.NET, codée en url et avec le support UTF-8, est présentée ci-dessous (notez que le codage en url requiert une référence à System.Web.dll, qui ne fonctionnait que lorsque je suis passé de .NET 4 Compact Framework à la norme. 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

Vous l'avez déjà envoyé avec UploadValues. La question est: quelle est votre "recherche de résultats"? Que retourne la page? HTML? Si tel est le cas, le HTML Agility Pack est le moyen le plus simple d’analyser le code HTML.

0
Marc Gravell