Winform模拟post请求和get请求登录网站

引言

最近有朋友问如何用winform模拟post请求,然后登录网站,稍微想了一下,大致就是对http报文的相关信息的封装,然后请求网站登录地址的样子。发现自己的博客中对这部分只是也没总结,就借着这股风,总结一下http报文的相关知识吧。

HTTP定义

超文本传输协议 (HTTP-Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。

 这里对http的具体内容就不再介绍了,主要分析http报文信息。

http报文分为:请求报文和响应报文。

HTTP请求报文

一个Http请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,请求报文个格式如下:

126d1a5bf17ad03c811c487cc4449375.png

Post请求

弄一个简单的登录页面,使用ajax发送post请求,在IE下浏览,F12分析一下它的请求报文:

6980fb43247d746bdef650e68ae87af2.png

    Accept:浏览器可接受的MIME类型。
    Accept-Charset:浏览器可接受的字符集。
    Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。
    Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。
    Authorization:授权信息,通常出现在对服务器发送的WWW - Authenticate头的应答中。
    Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep - Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个  Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。
    Content-Length:表示请求消息正文的长度。
    Cookie:这是最重要的请求头信息之一。

    From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。
    Host:初始URL中的主机和端口。
    If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答。
    Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。
    Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
    User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。
    UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。

请求正文

701efc1bf47106ce1e6936e6b7609822.png

从这里可以发现,请求正文就是我们要向服务器post提交的数据。

Get请求

将ajax的请求方式换成"GET",那么get方式请求报文是怎样的呢?

93cf4290184d96e44eef6bb2283489e4.png

34e392cda2af949235470fc5c32e87d3.png

8d9c063f80c14f55eb0130690c3acd9f.png

从上图可以看出post和get请求报文的区别,post提交的数据是在请求正文中,而get提交的数据是在url中。

Http响应报文

d017c2c91e14b2c61fe4dee6c2737266.png

从上图可以看出,响应报文和请求报文非常相似,包括:状态行、消息报文、响应正文。

在响应报文中第一行中用状态信息代替了请求信息,状态行(status)通过提供一个状态吗来说明所请求的资源情况。

状态行的格式为:

HTTP-Version Status-Code Reason-Phrase CRLF

其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态码;Reason-Phrase表示状态码的文本描述。状态码由三位数字组成,第一个数字定义了响应的类别,且有5种可能取值:

    • 1xx:指示信息——表示请求已接收,继续处理。

    • 2xx:成功——表示请求已被成功接收、理解、接受。比如200

    • 3xx:重定向——要完成请求必须进行更进一步的操作。

    • 4xx:客户端错误——请求有语法错误或请求无法实现。

    • 5xx:服务端错误——服务器未能实现合法的请求。

常见的状态码:

    • 200 OK:客户端请求成功。

    • 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。

    • 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。

    • 403 Forbidden:服务器收到请求,但是拒绝提供服务。

    • 404 Not Found:请求资源不存在。

    • 500 Internal Server Error:服务器发生不可预期的错误。

    • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能回复正常。

 GET和Post的区别

GET方式,请求的数据会在URL之后(就是将数据放置在http请求<request-line>中),以问号分割URL和传输数据,多个参数使用&连接,如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文或其他字符,则直接将字符串用Base64加密,在url中最常见的:%E4%BD%A0%E5%A5%BD,这种东东%XX中的XX为该符号以16进制表示的ASCII。

Post方式,把提交的数据防止在http的包体<request-body>中。上文请求正文中的数据就是实际传输的数据。

因此,get提交的数据会在地址栏中显示出来,而post不会。

GET:不同浏览器和服务器对URL长度有限制。例如IE对url的限制是2083字节。其他浏览器如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。

 因此对于get提交时,传输数据就会收到url长度限制。

POST:由于不是通过url传值,理论上是不受限的。但实际各个web服务器会规定对post提交数据大小进行限制。Apache、iis6都有各自的配置。

(以上参考文章:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/28/2612910.html)

get方式和post方式比较在安全性上较低,所以比较隐私性的东东一般采用post方式提交。谁也不愿意将自己用户名和密码在url中显示出来吧?

 winform登录模拟post方式登录

上面参考网络资源对http请求与响应报文又学习了一下,现在模拟post方式登录。get方式大致相似,不再赘述。

post类

1 using System;2 using System.Collections.Generic;3 using System.IO;4 using System.IO.Compression;5 using System.Linq;6 using System.Net;7 using System.Text;8 using System.Threading.Tasks;9 
10 namespace Wolfy.LoginTest
11 {
12     public class Post
13     {
14         /// <summary>
15         /// 获得post请求后响应的数据
16         /// </summary>
17         /// <param name="postUrl">请求地址</param>
18         /// <param name="referUrl">请求引用地址</param>
19         /// <param name="data">请求带的数据</param>
20         /// <returns>响应内容</returns>
21         public string PostLogin(string postUrl, string referUrl, string data)
22         {
23             string result = "";
24             try
25             {
26                 //命名空间System.Net下的HttpWebRequest类
27                 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(postUrl);
28                 //参照浏览器的请求报文 封装需要的参数 这里参照ie9
29                 //浏览器可接受的MIME类型
30                 request.Accept = "text/plain, */*; q=0.01";
31                 //包含一个URL,用户从该URL代表的页面出发访问当前请求的页面
32                 request.Referer = referUrl;
33                 //浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用
34                 request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)";
35                 request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
36                 //请求方式
37                 request.Method = "POST";
38                 //是否保持常连接
39                 request.KeepAlive = false;
40                 request.Headers.Add("Accept-Encoding", "gzip, deflate");
41                 //表示请求消息正文的长度
42                 request.ContentLength = data.Length;
43                 44                 Stream postStream = request.GetRequestStream();
45                 byte[] postData = Encoding.UTF8.GetBytes(data);
46                 //将传输的数据,请求正文写入请求流
47                 postStream.Write(postData, 0, postData.Length);
48                 postStream.Dispose();
49                 //响应
50                 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
51                 //判断响应的信息是否为压缩信息 若为压缩信息解压后返回
52                 if (response.ContentEncoding == "gzip")
53                 {
54                     MemoryStream ms = new MemoryStream();
55                     GZipStream zip = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress);
56                     byte[] buffer = new byte[1024];
57                     int l = zip.Read(buffer, 0, buffer.Length);
58                     while (l > 0)
59                     {
60                         ms.Write(buffer, 0, l);
61                         l = zip.Read(buffer, 0, buffer.Length);
62                     }
63                     ms.Dispose();
64                     zip.Dispose();
65                     result = Encoding.UTF8.GetString(ms.ToArray());
66                 }
67                 return result;
68             }
69             catch (Exception)
70             {
71 
72                 throw;
73             }
74         }
75     }
76 }

 请求中相关属性的值,你可以在浏览器,F12中,将对应的值,复制粘贴就可以,这东西不需要记。这里没有考虑cookie的,验证码的情况。

测试结果:根据返回值是1(成功),2(失败)
64b8be0aa26a9200d034241b6280d658.pngd6d8b9eb1313a9318c1e5be0a5100140.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

那些上海滩的金融传奇,或许都开始于一份PPT

全世界只有3.14 % 的人关注了爆炸吧知识 我从07年开始在上海做商务PPT定制&#xff0c;从工作室一步一步到国内首家PPT定制公司&#xff0c;从电脑前到讲台前做培训&#xff0c;算是见证了中国PPT行业的发展。在我大大小小做过的项目里&#xff0c;印象最深的莫过于“靠PPT拿下…

Android 控件之RatingBar评分条

RatingBar是Adnroid中的评分条。效果挺得的 源码下载 一、概述 RatingBar是SeekBar和ProgressBar的扩展&#xff0c;用星星来评级。使用的默认大小RatingBar时&#xff0c;用户可以触摸/拖动或使用键来设置评分&#xff0c;它有俩种样式&#xff08;大、小&#xff09;&#xf…

3d目标检测_CVPR 2020 |基用于3D目标检测的层级图网络

论文&#xff1a;A Hierarchical Graph Network for 3D Object Detection on Point Clouds论文地址&#xff1a;https://www.aminer.cn/pub/5eccb534e06a4c1b26a834c7?confcvpr2020由于大多数现有的点云对象检测方法不能充分适应点云的特征(例如稀疏性)&#xff0c;所以一些关…

position定位 响应式_使用 Vue3 实现双盒子定位 Overlay

之前说过&#xff0c;使用 可以很优雅的把某个组件渲染到根节点之外的节点&#xff0c;同时使其渲染的内容不丧失响应式和对应的生命周期函数调用。那么基于此&#xff0c;用 实现相对于某一元素的 Overlay 。实际上&#xff0c;这篇文章跟 Vue3 的关系不大&#xff0c;只是通…

月薪5 千~1万的兼职你要不要?不限学历,不限男女!

全世界只有3.14 % 的人关注了爆炸吧知识你想拥有一份月薪过万的兼职吗&#xff1f;窝在家里就行的那种&#xff1f;这就有一份看起来高大上、实则难度系数并不高的英语翻译&#xff01;兼职英语翻译到底有多赚钱&#xff1f;水平一般的英语笔译员一周7天每天拿出2小时翻译&…

【分享】154页微软WPF官方手册(含.NETCore和.NET Framwork双版本)

物联网IOT多场景概念落地&#xff0c;带火了WPF招聘&#xff0c;像阿里影视、百度地图、小米小鹏特斯拉都在高薪抢WPF人才了。机智的.NET开发者去关注学习WPF的时候却发现&#xff0c;市面上真的太缺WPF优秀的教程了&#xff0c;还好这里有最权威最详尽的微软官方pdf教程&#…

ln -s 的一个坑

为什么80%的码农都做不了架构师&#xff1f;>>> 事情是这样的&#xff0c;今天在ssh到iphone上将一个应用内目录软链接配置到用户目录下时&#xff0c;执行了如下命令&#xff1a; cd /var/mobile/Applications/9E13D9B8-63E0-49A5-82CE-6DB914495EC1/Documentsmkd…

知乎高赞:这个开挂神器简直了!

全世界只有3.14 % 的人关注了爆炸吧知识对于工作学习中常要用到PPT的人来说&#xff0c;每当谈起PPT&#xff0c;是否都会出现以下印象&#xff1a;[买模板]→[改PPT]→[粘贴复制]→[应付领导][操作繁琐]→[体力劳动]→[熬夜]→[加班]从什么时候开始&#xff0c;PPT从一个 表达…

性能再提升70%?大咖前瞻带你揭开.NET6的神秘面纱!

本月初微软官宣 .NET6 的RC1即将在11月正式发布&#xff0c;这意味着 .NET6 正式版跟我们见面的时间又近了一步。在之前的 .NET6 预览版本中&#xff0c;微软加入了大量新功能特性&#xff0c;而在最终版本中将不再额外加入新的内容&#xff0c;只对现在的内容进行进一步性能优…

JMS : Java Message Service (Java消息服务)之一 [转]

为什么80%的码农都做不了架构师&#xff1f;>>> 1 引言1.1 编写目的本文作为B2bi项目中开源产品JORAM的使用指导文档&#xff0c;旨在帮助项目组人员方便明了的进行JMS模块的详细设计和开发工作。本文档主要包含建设银行EAI平台B2Bi子系统中使用的开源JMS产品??J…

在床上玩手机,千万不能把手机放下!

1 当你在床上玩手机时▼2 据说兔子都是大长腿▼3 真是凭实力单的身▼后续▼4 这不是怕你不信嘛▼5 不看监控真不知道他咋上去的▼6 听说&#xff0c;他们已经没有暑假了▼7 感觉有被冒犯到▼你点的每个赞&#xff0c;我都认真当成了喜欢

python浪漫代码_五行Python代码实现批量抠图

你是否曾经想将某张照片中的人物抠出来&#xff0c;然后拼接到其他图片上去&#xff0c;从而可以即使你在天涯海角&#xff0c;我也可以到此一游&#xff1f;专业点的人使用 PhotoShop 的“魔棒”工具可以抠图&#xff0c;非专业人士可以使用各种美图 APP 来实现&#xff0c;但…

日常使用Git,这些问题你遇到过吗?

GitHub 作为世界上最大的代码托管平台&#xff0c;几乎所有的开发者都有个 GitHub 的账号。因为无论对于开发者还是普通用户来讲&#xff0c;GitHub 上面都有不少优质开源项目可以借鉴和学习。其受欢迎程度还体现在&#xff0c;越来越多的人会主动优化自己的 GitHub 主页&#…

Android API 中文(14) —— ViewStub

前言关键字&#xff1a; android.view.ViewStub&#xff0c;版本为Android 2.2 r1本章翻译来自唐明 &#xff0c;这里本博负责整理和发布&#xff0c;欢迎其他译者一起参与Android API 的中文翻译行动&#xff0c;联系我over140gmail.com。 声明 欢迎转载&#xff0c;但请保留文…

stm32l0的停止模式怎么唤醒_「正点原子STM32Mini板资料连载」第十九章 待机唤醒实验...

1)实验平台&#xff1a;正点原子STM32mini开发板2)摘自《正点原子STM32 不完全手册(HAL 库版)》关注官方微信号公众号&#xff0c;获取更多资料&#xff1a;正点原子第十九章 待机唤醒实验本章我们将向大家介绍 STM32 的待机唤醒功能。在本章中&#xff0c;我们将使用 WK_UP 按…

Pgbouncer 介绍

Pgbouncer 介绍 PostgreSQL 的轻量的连接池。 特性 在轮转连接的时候有好几种方式&#xff1a;Session pooling/会话连接池最礼貌的方法。在客户端连接的时候&#xff0c;在它的连接生命期内&#xff0c;会给它赋予一个服务器连接。在客户端断开的时候&#xff0c;服务器连接会…

阿里全球数学竞赛落幕:全球最强73人出炉,北大获奖人数第一,还“炸出”各路世界大牛...

全世界只有3.14 % 的人关注了爆炸吧知识来源&#xff1a;量子位 ID&#xff1a;QbitAI作者&#xff1a;边策 金磊又是一场学霸的盛宴。阿里达摩院举办的第二届数学竞赛今天顺利结束&#xff0c;这场号召全民参与的数学竞赛&#xff0c;初赛的题目画风是这样的&#xff1a;是不…

【Azure + Core】实现CI/CD(一)构建镜像并推送仓库

&#xff08;海上生明月&#xff0c;天涯共此时&#xff09;今天是农历八月十六&#xff0c;大家中秋节快乐&#xff01;放了三天假&#xff0c;和家人整理下屋子&#xff0c;打扫下卫生&#xff0c;闲着无聊就研究点儿新东西。最近一直再看DevOps相关的内容&#xff0c;自从开…

detectron2训练自己的数据集_keras版MaskRCNN来训练自己的目标检测数据集

向AI转型的程序员都关注了这个号&#x1f447;&#x1f447;&#x1f447;机器学习AI算法工程 公众号&#xff1a;datayx一、运行环境的安装&#xff1a;1、下载好cuda9跟cudnn7&#xff0c;然后在安装好后&#xff0c;cuda其会自动添加到环境变量里&#xff0c;所以使用kera…

Win7系统中必需记住的14个常用快捷键

在使用电脑时&#xff0c;多多少少地都会用到一些快捷键&#xff0c;尤其是在玩游戏&#xff0c;或使用一些软件时。快捷键不仅方便&#xff0c;如果用的好&#xff0c;甚至可以大大提升我们的工作效率。而且&#xff0c;快捷键不仅可以在软件中使用&#xff0c;在Win7系统中其…