C# 如何用C语言填写表格并与Webclient一起提交#
我对使用C#中的libraries WebClient、HttpResponse和HttpRequest还不太熟悉,所以如果我的问题让人难以理解,请耐心听我说 我需要构建一个基于C#的WinForm,它可以打开一个URL,该URL由基本授权进行保护。我将其添加到标题中,如下所示:C# 如何用C语言填写表格并与Webclient一起提交#,c#,webclient,C#,Webclient,我对使用C#中的libraries WebClient、HttpResponse和HttpRequest还不太熟悉,所以如果我的问题让人难以理解,请耐心听我说 我需要构建一个基于C#的WinForm,它可以打开一个URL,该URL由基本授权进行保护。我将其添加到标题中,如下所示: using (WebClient wc = new WebClient()) { wc.Headers.Add(HttpRequestHeader.Authorization, "Basic " + C
using (WebClient wc = new WebClient())
{
wc.Headers.Add(HttpRequestHeader.Authorization, "Basic " +
Convert.ToBase64String(
Encoding.ASCII.GetBytes(username + ":" + password)));
}
到目前为止,一切都很好!现在我想用一个数字填写一张表格,我从网站上找到了源代码,发现名称是“number”。所以我写下:
NameValueCollection formData = new NameValueCollection();
formData["number"] = number
byte[] responseBytes = wc.UploadValues(theurl, "POST", formData);
string response = Encoding.ASCII.GetString(responseBytes);
textBox_HTML.Text = response;
但我该如何提交?我希望收到我的“搜索结果”…您可能应该为此使用。下面是一个简单的例子:
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();
您已经用
上传值提交了它。问题是:你的“结果搜索”是什么?页面返回什么内容?HTML?如果是这样的话,这是解析html最简单的方法。我找到了解决问题的方法。首先,我对http通信中的一些基础知识感到困惑。这是由我编写的一个python脚本造成的,它采用了不同的通信方法
我通过从头开始生成POST数据并打开包含在表单操作中的uri解决了这个问题。BFree的答案非常有效。不过,我要注意的一点是,数据连接实际上应该是url编码的,否则数据中的“=”和“&”符号会有问题
下面是具有UTF-8支持的url编码的VB.NET版本(请注意,url编码需要引用System.Web.dll,它仅在我从.NET 4 Compact Framework切换到常规的.NET 4 Framework后才对我有效)
试试这个:
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);
}
使用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();
}
var formData=newdictionary();
formData.添加(“编号”,编号);
var内容=新的FormUrlEncodedContent(formData);
使用(var httpClient=new httpClient())
{
var httpResponse=wait httpClient.PostAsync(URL,内容);
var responseString=wait-httpResponse.Content.ReadAsStringAsync();
}
匈牙利符号和过度使用var让我想起了旧的Visual Basic时代。因此,对那些花时间使用您不喜欢的编码风格编写代码示例的人进行否决比实际提供答案更有帮助。有意思……我不同意你们的观点。我可以看看每一个VAR,告诉你它们没有IDE是什么。谢谢你的回答。我使用HttpWebrequest没有问题,但在我看来,代码中没有任何内容可以填写搜索表单并提交。这是我的主要问题。我通常也不使用匈牙利符号,我回答这个问题时一定复制并粘贴了代码。至于var,我经常使用它,我会捍卫它!!!如果我已经提交了UploadValues,为什么“响应”包含完全相同的代码,好像不使用UploadValues一样?代码如何知道HTML页面的提交按钮?我猜还有其他必需的表单元素。使用Fiddler跟踪来自服务器的实际请求并检查表单内容。“什么按钮”。。。请求中没有按钮;这是一个UI设备,浏览器将其转换为GET/POST/等。对不起,我对这个问题感到困惑,因为我很难弄清楚如何在页面上填写简单表单。生成的页面返回一个cgi页面,其中包含simpel up表中的信息(添加了对您问题的答复),因此我可以澄清一下,您希望将“响应”作为HTML表单处理并从中发布帖子吗?相反,使用形式知识会更容易——这可能吗?(使用类似小提琴手的东西)。如果必须使用实际表单,最好使用WebBrowser
之类的工具来使用实际的浏览器/DOM会话(而不是http,它对html一无所知)。
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();
}