使用 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

智能推荐

Siri究竟牛在哪里?深入解析苹果的人工智能助理_weixin_30740581的博客-程序员秘密

Siri究竟牛在哪里?深入解析苹果的人工智能助理浏览次数: 143次 2011年10月09日 果迷网字号: 大 中 小 分享到: QQ空间 新浪微博 腾讯微博 人人网 豆瓣网 开心网 更多 0不久前,苹果公司宣布下一代iPhone将启用一项新的语音识别系统:Siri。关于它的简介和部分发布会演示照片请参看果迷网之前的《Siri...

zookeeper做成windows服务启动_zookeeper.service_珍妮玛•黛金的博客-程序员秘密

zookeeper下载安装首先去官网下载zookeeper注意:zookeeper的安装路径一定不要有空格,作者之前就是因为安装在D:\Program Files\zookeeper-3.4.10路径下,路径中有空格(Program Files中间有空格)解决了很长时间,想尽各种办法,最后发现TMD的是空格原因配置环境变量添加ZOOKEEPER_SERVICE, ZOOKEEPER...

在群晖NAS上安装cpolar内网穿透-程序员秘密

在上两篇文章中,我们为大家介绍了,如何使用cpolar构建起一条(或多条)数据隧道,让我们能从公众互联网中,安全快速的访问到内网群晖NAS上的数据。不过,由于群晖使用的操作平台基础较为特殊,因此将cpolar导入群晖NAS的方式也有所不同。今天,我们就为大家介绍,如何为群晖NAS安装cpolar软件。......

LightOJ 1062 Crossed Ladders(二分)_KIJamesQi的博客-程序员秘密

int main(int argc, const char * argv[]){ int kase;cin >> kase; while(kase--) { double x, y, c;cin >> x >> y >> c; double l = 0, r = min(x, y); Rep(i, 1, 100) {

顿悟 ,百度强推Spring源码速成笔记,原来源码是这样理解的_Java小果的博客-程序员秘密

一定不要放弃阅读源码“源码”这两个字想必大家一看到是有人爱有人恨。后者在于:费时费力还复杂太考验耐心!但优秀的源码中有着多年积淀下来的精华,可以说阅读源码小到对源码所提供的功能上的使用更加熟练,大到使我们的程序设计更加完美优秀。身为程序员的我们为了不被时代淘汰,为了在同级中脱颖而出,肯定是不能停止学习的!为什么我们就不能做到通读源码?让多数人的短处成为我们的长处!如何学?想要掌握阅读源码的方法,看书站在巨人的肩膀上学习肯定是很好的一个途径,但光看书肯定枯燥无味,看书结合视频才是快速掌握阅读源码的

从输入URL到页面加载发生了什么?_兰亭古墨的博客-程序员秘密

最近在进行前端面试方面的一些准备,看了网上许多相关的文章,发现有一个问题始终绕不开: 在浏览器中输入URL到整个页面显示在用户面前时这个过程中到底发生了什么。仔细思考这个问题,发现确实很深,这个过程涉及到的东西很多。这个问题的回答真的能够很好的考验一个web工程师的水平,于是我自问自答一番。总体来说分为以下几个过程:DNS解析TCP连接发送HTTP请求服务器处理请求并返回HTTP报文浏览器解析渲染...

随便推点

MSIL(0):简介_weixin_34364071的博客-程序员秘密

Microsoft Intermediate Language (MSIL)微软中间语言 MSIL是将.NET代码转化为机器语言的一个中间过程。它是一种介于高级语言和基于Intel的汇编语言的伪汇编语言。当用户编译一个.NET程序时,编译器将源代码翻译成一组可以有效地转换为本机代码且独立于CPU的指令。当执行这些指令时,实时(JIT)编译器将它...

mybatis批量update操作的写法,及批量update报错的问题解决方法_javaQQ群 866865133的博客-程序员秘密

mybatis的批量update操作写法很简单,如下:如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。public interface YourMapper extends BaseMapper&amp;lt...

Linux网络设置--------教你如何配置双网卡进行上网-----一个挂了另一个顶替---------_博博的博客的博客-程序员秘密

文章目录一、查看网络配置1.1 查看网络接口信息1.2 查看主机名称hostname1.3 查看路由条目route1.4 查看网络连接情况netstat1.5 获取socket统计信息ss二、测试网络连接2.1 测试网络连接ping2.2 跟踪数据包traceroute2.3 域名解析nslookup三、 设置网络地址参数3.1 设置网络地址参数的方式3.2 设置网络接口参数3.3 设置路由记录route3.4 修改主机名hostname3.5 网络接口配置文件3.6 启用、禁用网络接口配置3.7 主机名配

iOS-UITableView 滚动到底部的方法_Virgo丶的博客-程序员秘密

1.- (void)scrollsToBottomAnimated:(BOOL)animated{    [self.tableViewscrollToRowAtIndexPath:[NSIndexPathindexPathForRow:self.dataArr.count-1inSection:0] atScrollPosition:UITableViewScro

iphone(objective-c)相当于j2me的drawRegion方法 截取部分图片显示到指定位置_trandy的博客-程序员秘密

图片(UIImage*) img要截取的起始坐标sx:(int) sx1 sy:(int)sy1要截取的长度和宽度sw:(int) sw1 sh:(int) sh1最终要显示的坐标desx:(int) desx1 desy:(int)desy1-(UIImage*)objecti

字节高低位反转——查表法_追求真实自己的博客-程序员秘密

1、介绍 在进行字节高低位反转时,往往都会通过移位去实现。而当有大量数据要执行字节反转时,用移位的话代码会执行较多时序且写起来代码量多易错。查表法主要是为了节省代码执行时序,增加MCU的执行效率。2、代码实现uint8_t r_byte(uint8_t x){ static const uint8_t table[] = { 0x00,...

推荐文章

热门文章

相关标签