使用 HttpWebRequest 发送模拟 POST 请求(转载)_httpwebrequest post_1进击的小白的博客-程序员秘密

技术标签: .net相关理论及应用  

原文地址:https://www.cnblogs.com/keyyang/p/3944944.html

网页中,如果form的method="POST",这时点击submit按钮可以给服务器发送了一个POST请求,如果method="GET",就是向服务器发送GET请求.

有兴趣可以先看看POST和GET的区别和使用方法。

 

这里,我在ASP.NET中使用两个简单的示例介绍了HttpWebRequest对像和使用HttpWebRequest对像模拟POST请求,HttpWebRequest对HTTP协议进行了完整的封装,对HTTP协议中的Header, Content, Cookie 都做了属性和方法的支持,很容易就能编写出一个模拟浏览器自动登录的程序。

 MSDN对HttpWebRequestHttpWebResponse的说明:

 这里简要介绍如何使用

HttpWebRequest&HttpWebResponse两个对象与HTTP服务器进行直接交互的过程,

HttpWebRequest类对WebRequest中定义的属性和方法提供支持,在使用HttpWebRequest对象向HTTP服务器发起请求时请不要使用HttpWebRequest对象的构造函数,而应该使用WebRequest.Create()方法来初始化新的HttpWebRequest对象。如果统一资源标识符方案是"http://"或"https://"时,Create()则返回HttpWebResponse对象。

  详细过程及代码如下:

 1、创建httpWebRequest对象,HttpWebRequest不能直接通过new来创建,只能通过WebRequest.Create(url)的方式来获得。 WebRequest是获得一些应用层协议对象的一个统一的入口(工厂模式),它根据参数的协议来确定最终创建的对象类型。

2、初始化HttpWebRequest对象,这个过程提供一些http请求常用的标头属性:agentstring,contenttype等,其中agentstring比较有意思,它是用来识别你用的浏览器名字的,通过设置这个属性你可以欺骗服务器你是一个IE,firefox甚至是mac里面的safari。

很多认真设计的网站都会根据这个值来返回对不同浏览器特别优化的代码。

3、附加要POST给服务器的数据到HttpWebRequest对象,附加POST数据的过程比较特殊,它并没有提供一个属性给用户存取,需要写入HttpWebRequest对象提供的一个stream里面。

4、读取服务器的返回信息,读取服务器返回的时候,要注意返回数据的encoding,如果我们提供的解码类型不对,会造成乱码,比较常见的是utf-8和gb2312。通常,网站会把它编码的方式放在http header里面,如果没有,我们只能通过对返回二进制值的统计方法来确定它的编码方式。

 =====================================================================

=================================  

 const string sUserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"; 

const string sContentType = "application/x-www-form-urlencoded"; 

const string sRequestEncoding = "ascii"; 

const string sResponseEncoding = "utf-8"; 

/// <summary> 

/// 1:Post data to url 

/// </summary> 

/// <param name="data">要post的数据</param> 

/// <param name="url">目标url</param> 

/// <returns>服务器响应</returns> 

static string PostDataToUrl(string data, string url) 

{ 

  Encoding encoding = Encoding.GetEncoding(sRequestEncoding); 

  byte[] bytesToPost = encoding.GetBytes(data); 

  return PostDataToUrl(bytesToPost, url); 

} 





/// <summary> 

/// Postdata to url 

 /// </summary> 

/// <param name="data">要post的数据</param> 

/// <param name="url">目标url</param> 

/// <returns>服务器响应</returns> 

static string PostDataToUrl(byte[] data, string url) 

 { 

  //创建httpWebRequest对象

   System.Net.WebRequest webRequest = System.Net.WebRequest.Create(url); 

  System.Net.HttpWebRequest httpRequest = webRequest as System.Net.HttpWebRequest; 

  if (httpRequest == null) 

  { 

    throw new ApplicationException(string.Format("Invalid url string: {0}", url)); 

  } 

   //填充httpWebRequest的基本信息



  httpRequest.UserAgent = sUserAgent; 

   httpRequest.ContentType = sContentType; 

  httpRequest.Method = "POST"; 

   //填充并发送要post的内容

   httpRequest.ContentLength = data.Length; 

  Stream requestStream = httpRequest.GetRequestStream(); 

  requestStream.Write(data, 0, data.Length); 

  requestStream.Close(); 

//发送post请求到服务器并读取服务器返回信息

   Stream responseStream = null;  

  try 

  { 

    responseStream = httpRequest.GetResponse().GetResponseStream(); 

  } 

  catch (Exception e) 

  { 

    throw e; 

  } 

  //读取服务器返回信息

   string stringResponse = string.Empty; 

  using (StreamReader responseReader = new StreamReader(responseStream, 

  Encoding.GetEncoding(sResponseEncoding))) 

  { 

    stringResponse = responseReader.ReadToEnd(); 

  } 

  responseStream.Close(); 

  return stringResponse; 

} 

//调用

 string contentHtml = PostDataToUrl("ename=simon&des=87cool", "http://www.87cool.com"); C# HttpWebRequest提交数据方式. 使用 GET 方式提交中文数据。
GET 方式通过在网络地址中附加参数来完成数据提交,对于中文的编码,常用的有 gb2312 和 utf8 两种,用 gb2312 
方式编码访问的程序代码如下:
        

Encoding myEncoding = Encoding.GetEncoding("gb2312");  
string address = "http://www.baidu.com/s?"   + HttpUtility.UrlEncode("参数一", myEncoding) +  "=" + HttpUtility.UrlEncode("值一", myEncoding);

HttpWebRequest req =   (HttpWebRequest)HttpWebRequest.Create(address); req.Method = "GET";  

using (WebResponse wr = req.GetResponse())  
  {  
         //在这里对接收到的页面内容进行处理  
  }  

在上面的程序代码中,我们以 GET 方式访问了网址 http://www.baidu.com/s,传递了参数“参数一=值一”,由于无法告知对方提交数据的编码类型,所以编码方式要以对方的网站为标准。常见的网站中, www.baidu.com(百度)的编码方式是gb2312,www.google.com (谷歌)的编码方式是 utf8。

C# HttpWebRequest提交数据方式4. 使用 POST 方式提交中文数据。
        POST 方式通过在页面内容中填写参数的方法来完成数据的提交,由于提交的参数中可以说明使用的编码方式,所以理论上能获得更大的兼容性。用 
        gb2312 方式编码访问的程序代码如下:
        

Encoding myEncoding = Encoding.GetEncoding("gb2312");  
            string param =   
            HttpUtility.UrlEncode("参数一", myEncoding) +   
            "=" + HttpUtility.UrlEncode("值一", myEncoding) +   
            "&" + HttpUtility.UrlEncode("参数二", myEncoding) +  
            "=" + HttpUtility.UrlEncode("值二", myEncoding);  
             
            byte[] postBytes = Encoding.ASCII.GetBytes(param);  
             
            HttpWebRequest req = (HttpWebRequest)  
            HttpWebRequest.Create( "http://www.baidu.com/s" );  
            req.Method = "POST";  
            req.ContentType =   
            "application/x-www-form-urlencoded;charset=gb2312";  
            req.ContentLength = postBytes.Length;  
             
            using (Stream reqStream = req.GetRequestStream())  
            {  
               reqStream.Write(bs, 0, bs.Length);  
            }  
            using (WebResponse wr = req.GetResponse())  
            {  
               //在这里对接收到的页面内容进行处理  
            }   

 

 //附加一个HttpWebRequest的一个小例子

 /// <summary> 

/// 小例子

2:直接请求,保存远程图片到本地 

/// </summary> 

static void SaveRemoteImg() 

{ 

   System.Net.HttpWebRequest httpRequest = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create("http://www.87cool.com.logo.gif"); 

  httpRequest.Timeout = 150000; 

  System.Net.HttpWebResponse resp = (System.Net.HttpWebResponse)httpRequest.GetResponse(); 

  System.Drawing.Image img = new 

  System.Drawing.Bitmap(resp.GetResponseStream()); 

  img.Save("/87cool.com.gif"); 

} 

个人实例:

1、

public static string HttpPostByte(string Url, string postDataStr, string contentType)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
            request.Method = "POST";
            request.ContentType = contentType;
            string paraUrlCoded = postDataStr;
            byte[] payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded);
            request.ContentLength = payload.Length;
            Stream writer = request.GetRequestStream();
            writer.Write(payload, 0, payload.Length);
            writer.Close();

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            Stream myResponseStream = response.GetResponseStream();
            StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
            string retString = myStreamReader.ReadToEnd();
            myStreamReader.Close();
            myResponseStream.Close();

            return retString;
        }

2、

public static string HttpPostString(string url, string postDataStr, string contentType)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            request.ContentType = contentType;
            //request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr);
            Stream myRequestStream = request.GetRequestStream();
            StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("GB2312"));
            myStreamWriter.Write(postDataStr);
            myStreamWriter.Close();

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            Stream myResponseStream = response.GetResponseStream();
            StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
            string retString = myStreamReader.ReadToEnd();

            return retString;
        }

3、

public static string HttpGet(string Url, string getDataStr)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (getDataStr == "" ? "" : "?") + getDataStr);
            request.Method = "GET";
            request.ContentType = "text/html;charset=UTF-8";

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream myResponseStream = response.GetResponseStream();
            StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
            string retString = myStreamReader.ReadToEnd();
            myStreamReader.Close();
            myResponseStream.Close();

            return retString;
        }

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33380252/article/details/86001046

智能推荐

Apache Hudi和Presto的前世今生_xleesf的博客-程序员秘密

一篇由Apache Hudi PMC Bhavani Sudha Saktheeswaran和AWS Presto团队工程师Brandon Scheller分享Apache Hudi和Presto集成的一篇文章。1. 概述Apache Hudi 是一个快速迭代的数据湖存储系统,可以帮助企业构建和管理PB级数据湖,Hudi通过引入upserts、deletes和增量查询等原语将流式能力带入了批处理。这些特性使得统一服务层可提供更快、更新鲜的数据。Hudi表可存储在Hadoop兼容的分布式文件系统或者云上对

SUSE Linux 扩展磁盘空间_suse 调整分区大小_samson_www的博客-程序员秘密

oracle通过备份到通过iscsi连接挂载的NAS盘上。因为备份数据大了,经常出现空间满,于是扩展了nas盘空间,同时也就需要在linux系统中扩展分区空间,因为不是采用LVM,所以扩容麻烦多了。1、查看磁盘文件格式suse12sp3:~ # df -T/dev/sdc1 ext4 /u01/nasbackup原来的格式是ext4的,后面可以使用resize2fs2.umount直接umount,肯定是会遇到Device or resource bus...

如何过滤 adb logcat 输出_残诗的博客-程序员秘密

对原作者表示感谢,转自博客:http://www.otechu.me/zh/2011/12/filtering-adb-logcat-output/本文介绍如何在 shell 命令行中过滤 adb logcat 输出的几个小技巧。开发当中经常看到别人的 log 如洪水般瞬间刷满了屏幕,对自己有用的信息都被淹没了,影响心情也影响效率。下面是几个我所知道的过滤方法。1. 只显示需要的输出,白名单最方便

深大uooc学术道德与学术规范教育第七章_关于伪造科研数据下列说法错误的是_多多搞科研的博客-程序员秘密

一、单选题 (共 90.00 分)1.关于学术造假,下列说法是不正确的是( )A.指伪造、修改研究数据和资料等学术腐败行为B.通常是由研究者学风浮躁和急功近利所致C.为了令理论假设成立,加工和筛选数据并不是造假D.是一种违背学术道德和科学精神的表现满分:15.00 分得分:15.00 分你的答案:C正确答案:C教师评语:暂无2.资料分析中的失范行为往往也被称为学术造假,下列情况不属于学术造假的是( )A.筛选数据B.整理数据C.加工数据D.伪造数据满

GB28181流媒体web直播方案设备信息查询信令分析_staritstarit的博客-程序员秘密

关于LiveGBS GB28181流媒体服务器的部署详见https://www.liveqing.com/docs/download/LiveGBS.html。通过LiveGBS流媒体服务可以实现GB28181接入摄像头、硬盘录像机、其他支持GB28181的视频平台,实现网页无插件直播。如下是GB28181注册成功后设备状态查询的信令分析:1、发送设备信息查询命令 (服务&gt;&g...

程序员删代码的快感?_code小生_的博客-程序员秘密

点击️方“逆锋起笔”,公众号回复编程资源领取大佬们推荐的学习资料来源 | CSDN微信公众号|逆锋起笔作为程序员,你删过代码吗?删代码会有快感吗?为啥会有这种奇怪的想法,不妨...

随便推点

syslinux 和 grub_weixin_30414155的博客-程序员秘密

syslinux是一个功能强大的引导加载程序,而且兼容各种介质。它的目的是简化首次安装Linux的时间,并建立修护或其它特殊用途的启动盘。它的安装很简单,一旦安装syslinux好之后,sysLinux启动盘就可以引导各种基于DOS的工具,以及MS-DOS/Windows或者任何其它操作系统。不仅支持采用BIOS结构的主板,而且从6.0版也开始支持采用EFI结构的新型主板。pxlinux是sysl...

SUMO 中的红绿灯设置_sumo红绿灯调控_大白羊的进阶之路的博客-程序员秘密

原文地址: https://blog.csdn.net/qtlyx/article/details/49622085毕竟所有的网路信息,包括交通信号灯的默认设置信息都在里面,所以直接修改net.xml文件或许可以实现。果不其然,在测试的net文件中,发现了下面这样一段代码:很显然,这一段就是对node5节点上的交通信号灯的完全描述。tlLgic节点中id就是node的id,所以说,...

labview与matlab接口,LabVIEW Comms与MATLAB的互联接口_痒太晚的博客-程序员秘密

为了复用现有的MATLAB代码,LabVIEW Communications System Design Suite (LabVIEW Comms) 新增了MATLAB专用接口的功能。无线原型的开发者可使用已有的MATLAB函数或脚本,将其连接至LabVIEW Comms在Windows处理器上运行的代码部分。MATLAB专用接口完全支持MATLAB工具箱,因为MATLAB专用接口会用到与Lab...

解决浏览器进入控制台无限debugger_浏览器控制台一直弹debugger_死磕呀的博客-程序员秘密

首先 进入 浏览器的开发者工具(F12),进入后会有个无限debugger,如下图所示过掉无线debugger模式,鼠标右击 选择 never pause here,过掉debugger(其他的方式),然后就可以了

kali更新命令_金色的天空的博客-程序员秘密

apt-get update #只更新软件包的索引源,作用是同步源的软件包的索引信息,从而进行软件更新apt-get upgrade #升级系统上安装的所有软件包,若更新失败,所涉及的包会保持更新之前的状态apt-get dist-upgrade #升级整个linux系统(不仅能够升级所有已安装的软件包,而且会处理升级过程中可能会出现的软件冲突。某些情况下,它的部分升级过程需要人工参与)apt-get install soft_name #安装软件...

java.lang.IllegalStateException: Error processing condition on org.springframework.boot.autoconfigur_itke的博客-程序员秘密

java.lang.IllegalStateException: Error processing condition on org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration$ThymeleafWebMvcConfiguration.resourceUrlEncodingFilter at...

推荐文章

热门文章

相关标签