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