【问题标题】:C# HttpWebRequest Post Method many parameters in formC# HttpWebRequest Post 方法表单中的许多参数
【发布时间】:2012-11-19 10:32:01
【问题描述】:

我正在编写一个简单的 C# 程序来执行一些 Web 请求和发布数据。 我了解基础知识的工作原理,例如如何使用密码和 html 表单的内容登录。 但是我想知道是否有很多输入参数(例如这个问题页面),例如复选框和文本字段,有没有比在字符串中硬编码 20 个参数并传递它更有效的方法?我可以读取 html 文件解析它并扫描输入并使用 String builder 来制作这样的字符串,但我想知道有没有比这样做更有效的方法?

    private HtmlAgilityPack.HtmlDocument getpage(string url ,String input)
    {
        try
        {
            Stream datastream;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.CookieContainer = new CookieContainer();
            request.CookieContainer.Add(cookies);
            request.AllowAutoRedirect = true;
            request.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2";
            request.ContentType = "application/x-www-form-urlencoded";

            if (input!=null)
            {
                String postData = "";
                request.Method = "POST";
                if (input == "login")
                {
                    postData = String.Format("username={0}&password={1}", "myusername", "mypassword");
                }
                else if (input == "sendMessage")
                {
                //THIS IS THE LONG STRING THAT I DON'T WANT TO HARD CODE
                    postData = String.Format("reciever={0}&sendmessage={1}", "thepersontomessage" ,this.DefaultMessage);
                //I am just puting two parameters for now, there should be alot
                }
                byte[] byteArray = Encoding.UTF8.GetBytes(postData);
                request.ContentLength = byteArray.Length;
                datastream = request.GetRequestStream();
                datastream.Write(byteArray, 0, byteArray.Length);
                datastream.Close();
            }

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            datastream = response.GetResponseStream();
            String sourceCode = "";
            using (StreamReader reader = new StreamReader(datastream))
            {
                sourceCode = reader.ReadToEnd();
            }

            HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
            htmlDoc.LoadHtml(sourceCode);
            this.cookies.Add(response.Cookies);
            return htmlDoc;
        }
        catch (Exception)
        {
            return null;
        }

还有一种简单的方法可以查看当我在浏览器中单击 html 表单上的按钮时设置的参数值(基本上是发送的 url 字符串和参数值),以便我可以将这些值硬编码到Postdatastring(复选框、文本等)

【问题讨论】:

  • 要查看浏览器向服务器发送的内容,请安装Fiddler

标签: c# .net html parameters httpwebrequest


【解决方案1】:

我个人会做的是将参数构建为Dictionary<string,string>,以便您可以这样做:

var parms = new Dictionary<string,string>();

parms.Add("username","fred");

然后你可以有一个方法,比如:

string DictToString(Dictionary<string,string> dict)
{
   StringBuilder builder = new StringBuilder();

   foreach(KeyValuePair<string,string> kvp in dict) {
      builder.Append(kvp.Key + "=" + kvp.Value + "&");
   }

   return builder.ToString();
}

然后你可以得到最终的参数字符串:

var parms_str = builder.ToString();

【讨论】:

  • 嘿,谢谢你的回复,我不知道为什么有人会无缘无故地对你投反对票,但我想把键和值放在字典里,我仍然需要解析 Html 和从表单中获取所有输入对吗?没有其他更简单的方法吗?
  • 您可以使用上面提到的同一个字典,然后将其传递给 WebClient.UploadValues()。这将为您正确格式化 FORM POST。您不必自己创建查询字符串。
  • 但是如果其中一个参数是文件呢?我应该将其转换为 byte[] 然后再转换为字符串吗?
  • @UrielArvizu 否。这仅适用于以application/x-www-form-urlencoded 发送的数据。如果您想支持文件,您可能需要使用multipart/form-data
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 2023-02-19
  • 1970-01-01
相关资源
最近更新 更多