【Asp.net精品源码栏目提醒】:网学会员为需要Asp.net精品源码的朋友们搜集整理了【精品】以太网知识 - 其它资料相关资料,希望对各位网友有所帮助!
HTTP 协议及其 POST 与 GET 操作差异 amp C中如何使用POST、GET 等 2010-05-18 15:29 by 吴秦 14304 visits 网摘 收藏 编辑 引言 HTTP 协议我想任何 IT 人士都耳熟能详了,大家都能说出个所以然来。
但是如果我问你 HTTP 协议的请求方法有哪些?POST 与 GET 的差异?GET 或 POST 传送数据量的大小有 限制吗?HTTP 响应的状态有哪些?以及在 C中你如何使用?如果你不能清楚地回答其中 的大部分问题,那么这篇文章就是为你准备的!大纲如下: 1、HTTP 概述 o 1.1、HTTP 协议的客户端与服务器的交互 o 1.2、HTTP 消息 o 1.3、HTTP 请求的方法 o 1.4、HTTP 响应的代码 2、抓包分析 3、POST 与 GET 的差异 4、以一个实例说明 C中如何使用 POST、GET 等操作 o 4.1、HttpWebRequest o 4.2、HttpWebResponse o 4.3、编写 WinForm 程序打开博客园首页(附
源码) 1、HTTP 概述 为了唤醒你对 HTTP 协议的记忆或使你能够对 HTTP 协议有所了解,首先简单一下 HTTP 协议。
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛 的一种网络协议。
所有的 WWW 文件都必须遵守这个标准。
设计 HTTP 最初的目的是为了 提供一种发布和接收 HTML 页面的方法。
HTTP 的发展是万维网协会(World Wide Web Consortium) Internet 工作小组 和 (Internet (他们)最终发布了一系列的 RFC,其中最著名的Engineering Task Force)合作的结果,就是 RFC 2616。
RFC 2616 定义了 HTTP 协议中一个现今被广泛使用的版本——HTTP 1.1。
1.1、HTTP 协议的客户端与服务器的交互HTTP 是一个客户端和服务器端请求和应答的标准(TCP) 。
客户端是终端用户,服务器端是网站。
通过使用 Web 浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指 (我们称这个客户端)调用户代理(user agent)定端口(默认端口为 80)的 HTTP 请求。
。
应答的服务器上存储着(一些)资源,比如 HTML 文件和图像。
(我们称)这个应答服务器为源服务器(origin server) 。
在用户代理和源服务器中间可能存在多个中间层,比如代理,网关,或者隧道(tunnel)尽 管 TCP/IP 协议是互联网上最流行的应用,HTTP 协议并没 。
有规定必须使用它和(基于)它支持的层。
事实上,HTTP 可以在任何其他互联网协议上,或者在其他网络上实现。
HTTP 只假定(其下层协议提供)可靠的传输,任何能够提供这种保证的协议都可以被其使用。
通常,由 HTTP 客户端发起一个请求,建立一个到服务器指定端口(默认是 80 端口)的TCP 连接。
HTTP 服务器则在那个端口监听客户端发送过来的请求。
一旦收到请求,服务器(向客户端)发回一个状态行,比如quotHTTP/1.1 200 OKquot,和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。
HTTP 使用 TCP 而不是 UDP 的原因在于(打开一个)一个网页必须传送很多数据,而 TCP协议提供传输控制,按顺序组织数据,和错误纠正。
通过 HTTP 或者 HTTPS 协议请求的资源由统一资源标识符(Uniform Resource Identifiers,或者,更准确一些,URI)来标识。
客户端与服务器端的结构与交互过程可以表示为下面 2 张图:图 1、Web 客户端-服务器端结构(其中 web 服务器的超文本链接,即通过网站上的一个链 接跳转到了其他服务器上) 图 2、Web 客户端与服务器端的交互1.2、HTTP 消息 客 户 端 与 服 务 器 之 间 的 交 互 用 到 了 两 种 类 型 的 消 息 : 请 求 ( Request ) 和 响 应(Response)。
HTTP 请求的格式为: 图 3、HTTP 请求的格式HTTP 响应的格式为: 图 4、HTTP 响应的格式从上面可以看出 HTTP 的请求和响应消息的首部均包含可变数量的字段, (blank 用一个空行line)将所有首部字段(header)与消息主体(body)分隔开来。
一个首部字段由字段名和随后的冒号、一个空格和字段值组成,字段名不区分大小写。
报文头可分为三类:一类应用于请求,一类应用于响应,还有一类描述主体。
有一些报文头(例如:Date)既可用于请求又可用于响应。
描述主体的报文头可以出现在 POST 请求和所有响应报文中。
HTTP 的首部字段如下图所示: 图 5、HTTP 首部字段 1.3、HTTP 请求的方法 HTTP/1.1 协议中共定义了八种方法(有时也叫“动作”)来表明 Request-URI 指定的资源的 不同操作方式: OPTIONS 返回服务器针对特定资源所支持的 HTTP 请求方法。
也可以利用向 Web 服务器发送 的请求来测试服务器的功能性。
HEAD 向服务器索要与 GET 请求相一致的响应,只不过响应体将不会被返回。
这一方法可以在 不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
GET 向特定的资源发出请求。
注意:GET 方法不应当被用于产生“副作用”的操作中,例如在 Web Application 中。
其中一个原因是 GET 可能会被网络蜘蛛等随意访问。
POST 。
数据被包含在请求体 向指定资源提交数据进行处理请求(例如提交表单或者上传文件) 中。
POST 请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 向指定资源位置上传其最新内容。
DELETE 请求服务器删除 Request-URI 所标识的资源。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
方法名称是区分大小写的。
当某个请求所针对的资源不支持对应的请求方法的时候,服务器 应当返回状态码 405(Method Not Allowed) ;当服务器不认识或者不支持对应的请求方法 的时候,应当返回状态码 501(Not Implemented) 。
HTTP 服务器至少应该实现 GET 和 HEAD 方法,其他方法都是可选的。
此外,除了上述方 法,特定的 HTTP 服务器还能够扩展自定义的方法。
安全方法 开发者应当意识到他们的软件代表了用户在因特网上进行交互,并且应当告知用户,他们正 在进行的操作可能对他们自身或者其他人有未曾预料的重要影响。
特别地,对于 GET 和 HEAD 方法而言,除了进行获取资源信息外,这些请求不应当再有任 何其他意义。
也就是说,这些方法应当被认为是“安全的”,即所谓安全的意味着该操作用于 获取信息而非修改信息。
客户端应当使用其他“非安全”方法,例如 POST、PUT 及 DELETE来以特殊的方式(通常是按钮而不是超链接)使得客户能够意识到可能要负的责任(例如一个按钮带来的资金交易)或者被告知正在请求的操作可能是不安全的(例如某个文件将被上 。
传或删除)但是,不能想当然地认为服务器不会在处理某个 GET 请求时不会产生任何副作用。
事实上,很多动态资源会把这作为其特性。
这里重要的区别在于用户并没有请求这一副作用,因此不应由用户为这些副作用承担责任。
幂等方法假如在不考虑诸如错误或者过期等问题的情况下,若干次请求的副作用与单次请求相同或者根本没有副作用,那么这些请求方法就能够被视作“幂等”的。
GET,HEAD,PUT 和 DELETE方法都有这样的幂等属性,同样由于根据协议,OPTIONS,TRACE 都不应有副作用,因此也理所当然也是幂等的。
假如某个由若干个请求做成的请求串行产生的结果在重复执行这个请求串行或者其中任何一个或多个请求后仍没有发生变化,则这个请求串行便是“幂等” 的。
但是,可能出现若干个请求做成的请求串行是“非幂等”的,即使这个请求串行中所有执行的请求方法都是幂等的。
例如,这个请求串行的结果依赖于某个会在下次执行这个串行的过程中被修改的变量。
1.4、HTTP 响应的代码服务器程序响应的第一行叫状态行。
状态行以 HTTP 版本号开始,后面跟着 3 位数字表示响应代码,最后是易读的响应短语。
根据第一位可以把响应分成 5 类: 图 6、HTTP 响应代码2、抓包分析现在我们对 HTTP 基本上算是了解了,下面我用 wireshark 抓取打开博客园首页时,我的电脑与博客园服务器的交互过程的 HTTP 数据包。
做好准备工作,关闭一些可能干扰我们抓取打开博客园的相关程序。
如下图,我们在浏览器中输入 www.cnblogs.com 并确定时,首先抓到如下包: 图 7、打开博客园抓取的包从图中可以看出,我们在浏览器中输入 www.cnblogs.com 并确定时是向服务器发送了一个HTTP 请求消息:GET / HTTP/1.1。
据 1.2 中介绍的 HTTP 消息的格式, 根 我们知道 GET对应 request、/对应 request-line、HTTP/1.1 对应版本号。
除了请求行之外,发送了一些首部字段, Accept、 如: Accept-Language、User-Agent、Accept-Encoding、Host、Connection等。
而且可以看出他们的格式就是:首部字段名: 字段值,注意冒号后面有个空格。
接下来我们看一下 GET / HTTP/1.1 请求的响应消息是怎样的: 图 8、GET / HTTP/1.1 请求的响应消息响应消息的状态行是:HTTP/1.1 200 OK,其中 HTTP/1.1 对应版本号、200 对应response-code、OK 对应 response-phrase。
除了状态行,还返回了一些首部字段,如:Cache-Control、Content-Type、Content-Encoding、Expires、Last-Modified、Vary、Server (通过上图我们可以看出,博客用的是 IIS7.0)等等。
上面抓的是 GET 的数据包,现在我来看一个 POST 的数据包——打开博客园首页过程中获取左边的分类信息就是通过 POST 请求返回的。
图 9、POST 数据包 我们可以看到,POST /ws/PublicUserService.asmx/GetLoginInfo HTTP/1.1。
除了把 GET 换成了 POST 之外,其它信息差不多。
下面我们放大看下发送的首部字段: 图 10、POST /ws/PublicUserService.asmx/GetLoginInfo HTTP/1.1 的首部字段 NOTE:本节涉及的一些首部字段我就不在这里解释了。
我想,到了这里大家对 HTTP 的认 识应该更深入了一步。
3、POST 与 GET 的差异 1.3 中介绍了 8 种方法,其中 GET 与 POST 最基本和常用了。
表单提交中 get 和 post 方式 的区别归纳如下几点: GET 是从服务器上获取数据,POST 是向服务器传送数据。
GET 是把参数数据队列加到提交表单的 ACTION 属性所指的 URL 中,值和表单 内各个字段一一对应,在 URL 中可以看到。
POST 是通过 HTTP POST 机制,将表单内 各个字段与其内容放置在 HTML HEADER 内一起传送到 ACTION 属性所指的 URL 地 址。
用户看不到这个过程。
对于 GET 方式,服务器端用 Request.QueryString 获取变量的值,对于 POST 方 式,服务器端用 Request.Form 获取提交的数据。
GET 传送的数据量较小,不能大于 2KB(这主要是因为受 URL 长度限制) POST 。
传送的数据量较大,一般被默认为不受限制。
但理论上,限制取决于服务器的处理能力。
GET 安全性较低,POST 安全性较高。
因为 GET 在传输过程,数据被放在请求的 URL 中,而如今现有的很多服务器、代理服务器或者用户代理都会将请求 URL 记录到 日志文件中,然后放在某个地方,这样就可能会有一些隐私的信息被第三方看到。
另外, 用户也可以在浏览器上直接看到提交的数据,一些系统内部消息将会一同显示在用户面 前。
POST 的所有操作对用户来说都是不可见的。
在 FORM 提交的时候,如果不指定 Method,则默认为 GET 请求(.net 默认是 POST) Form , 中提交的数据将会附加在 url 之后,以分开与 url 分开。
字母数字字符原样发送,但空格转 (或 ISO Latin-1) 其它符号转换为XX其中 XX 为该符号以 16 进制表示的 ASCII 换为“”号, 值。
GET 请求请提交的数据放置在 HTTP 请求协议头中,而 POST 提交的数据则放在实 体数据中;GET 方式提交的数据最多只能有 2048 字节,而 POST 则没有此限制。
POST 传递的参数在 doc 里,也就 http 协议所传递的文本,接受时再解析参数部分。
获得参数。
一般用 POST 比较好。
POST 提交数据是隐式的,GET 是通过在 url 里面传递的,用来传递 一些不需要保密的数据,GET 是通过在 URL 里传递参数,POST 不是。
说明:关于“POST 与 GET 的差异”查考了网上前辈的资料,由于找不出源头,到处都是转 帖,这里就不贴出相关网址了,baidu 或 Google 下就知道了。
4、以一个实例说明 C中如何使用 POST、GET 等操作 在介绍实例之前,我们要先介绍一下 HttpWebRequest 和 HttpWebResponse,在 C中就 是用这两个类实现客户端向服务器端发送 HTTP 消息、客户端接受服务器端的 HTTP 响应。
4.1、HttpWebRequest 在设计实现实例之前我们首先要介绍一下 HttpWebRequest 这个类——提供 WebRequest类的 HTTP 特定的实现,HttpWebRequest 类对 WebRequest 中定义的属性和方法提供支持,也对使用户能够直接与使用 HTTP 的服务器交互的附加属性和方法提供支持。
不要使用 HttpWebRequest 构造函数。
使用 System.Net.WebRequest.Create 方法初始化新 的 HttpWebRequest 对 象 。
如 果 统 一 资 源 标 识 符 URI 的 方 案 是 http:// 或https://,则 Create 返回 HttpWebRequest 对象。
HTTP 消息的首部字段(headers)在 HttpWebRequest 中表示为公开的属性。
下表列出 ,了由属性或方法设置或由系统设置的 HTTP 标头。
如果本地计算机配置指定使用代理,或者如果请求指定代理,则使用代理发送请求。
如果未指定代理,则请求发送到服务器。
HttpWebRequest 类主要包括如下方法,用于与 HTTP 服务器交互: Abort: 取消对 Internet 资源的请求。
AddRange: 向请求添加范围标头。
BeginGetRequestStream:开始对用来写入数据的 Stream 对象的异步请求。
BeginGetResponse:开始对 Internet 资源的异步请求。
(从 WebRequest 继承。
Create:初始化新的 WebRequest。
) CreateDefault:为指定的 URI 方案初始化新的 WebRequest 实例。
(从 WebRequest 继承。
) CreateObjRef:创建一个对象,该对象包含生成用于与远程对象进行通信的代理 所需的全部相关信息。
(从 MarshalByRefObject 继承。
) EndGetRequestStream:结束对用于写入数据的 Stream 对象的异步请求。
EndGetResponse:结束对 Internet 资源的异步请求。
GetRequestStream:获取用于写入请求数据的 Stream 对象。
GetResponse:返回来自 Internet 资源的响应。
GetSystemWebProxy:返回当前模拟用户的 Internet Explorer 设置中配置的代 (从 WebRequest 继承。
理。
) InitializeLifetimeService:获取控制此实例的生存期策略的生存期服务对象。
(从 MarshalByRefObject 继承。
) (从 WebRequest 继 RegisterPrefix:为指定的 URI 注册 WebRequest 子代。
。
) 承 4.2、HttpWebResponse 在设计实现实例之前我们还要介绍一下 HttpWebRequest 这个类——提供 WebResponse 类 的 HTTP 特定的实现。
此类包含对 WebResponse 类中的属性和方法的 HTTP 特定用法的 支持。
HttpWebResponse 类用于生成发送 HTTP 请求和接收 HTTP 响应的 HTTP 独立客 户端应用程序。
注意 不要混淆 HttpWebResponse 和 HttpResponse 类;后者用于
ASP.NET 应用程序, 而且它的方法和属性是通过
ASP.NET 的内部 Response 对象公开的。
决 不 要 直 接 创 建 HttpWebResponse 类 的 实 例 。
而 应 当 使 用 通 过 调 用 HttpWebRequest.GetResponse 所 返 回 的 实 例 。
您 必 须 调 用 Stream.Close 方 法 或 HttpWebResponse.Close 方 法 来 关 闭 响 应 并 将 连 接 释 放 出 来 供 重 用 。
不 必 同 时 调 用 Stream.Close 和 HttpWebResponse.Close,但这样做不会导致错误。
从 Internet 资源返回的公共标头信息公开为该类的属性。
有关完整的列表,请参见下表。
可 以 从 Headers 属 性 以 名 称 / 值 对 的 形 式 读 取 其 他 标 头 。
下 表 显 示 可 以 通 过 HttpWebResponse 类的属性使用的公共 HTTP 标头。
通 过 调 用 GetResponseStream 方法,以 Stream 的形式返回来自 Internet 资源的响应的内容。
HttpWebRequest 类主要包括如下方法与 HTTP 服务器交互:与 HttpWebRequest 类相比, ( 方法较少) CreateObjRef:创建一个对象,该对象包含生成用于与远程对象进行通信的代理 (从 MarshalByRefObject 继 。
所需的全部相关信息。
承 ) GetLifetimeService:检索控制此实例的生存期策略的当前生存期服务对象。
(从 MarshalByRefObject 继承。
) GetResponseHeader:获取与响应一起返回的标头的内容。
GetResponseStream:获取流,该流用于读取来自服务器的响应的体。
InitializeLifetimeService:获取控制此实例的生存期策略的生存期服务对象。
(从 MarshalByRefObject 继承。
) 4.3、编写 WinForm 程序打开博客园首页(附
源码) 通过前面两小节的介绍,我们对 HttpWebRequest 类和 HttpWebRequest 类有所了解,现 在我们就应用它们来编写一个小程序来实践。
程序界面大概如下: 功能也比较简单,就是通过点击“在 WebBrowser 中显示”按钮就在下方的 WebBrowser 控 件中显示博客园首页,通过点击查看“html
源码”按钮就弹出一个对话框显示博客园首页的 html
源码。
首先我们介绍如何实现——通过点击查看“html
源码”按钮就弹出一个对话框显示博客园首 页的 html
源码。
核心代码如下: 通过点击查看“html
源码”按钮就弹出一个对话框显示博客园首页的 html
源码其实这个过程更我们通过在浏览器中输入博客园网站打开效果是一样的,只不过在这里我们是通过 HttpWebRequest 类和 HttpWebRequest 类的对象来实现的。
然而,通过点击“在 WebBrowser 中显示”按钮就在下方的 WebBrowser 控件中显示博客园首页的功能类似,只不过是在 WebBrowser 控件中显示且我这里把一些常用的 HTTP 相关的操作封装到一个命名空间 Helper 中,便于以后使用,本质跟上面的是一样的。
点击下载整个项目的
源码。
我这个
源码还是比较简陋,只是简单地实现了使用 HttpWebRequest 类和 HttpWebRequest类与 HTTP 服务器交互.
上一篇:
【精品】计算机专业毕业设计
下一篇:
政府形象媒体危机的处置策略研究