http报文格式和post, get方式区别与误区(很不错哦)

自己动手学TCP/IP–http协议(http报文格式) - 推酷  http://www.tuicool.com/articles/Urieea

HTTP(HyperText Transport Protocol,超文本传送协议)

HTTP请求报文

http请求数据包的格式:头部(request line + header)+  数据(data)

头部和数据包体通过一个 空行 来隔开,头部的格式主要包括 请求行+请求头部 。如下图

请求行

请求行由请求 方法字段 、 URL字段 和 HTTP协议版本 字段3个字段组成,它们用空格分隔如:

GET /index.html HTTP/1.1。

HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET方法和POST方法。

GET方式:在URL里面就说明要请求的资源,URL里面 包含参数 ,“?”后面就是参数,而“?”前面就是URL的结束。“?ip=192.168.156.11&active=on”这种就是GET方式的包,而服务器把客户端请求的内容在数据段里面发回给客户端。

POST方式:传输的数据不在URL里面出现,而是在 数据段 里面出现。但是请求头部多了Content-Type和Content-Length两个字段。

请求头部

请求头部由(关键字:<空格>值)对组成,每行一对,关键字和值用英文冒号“:<空格>”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:

User-Agent:产生请求的浏览器类型。

Accept:客户端可识别的内容类型列表。

Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

下面是GET包的一个例子:传输的数据在URL里

再看看POST包的例子:传输的数据在数据段里面

HTTP响应报文

HTTP响应也由两个个部分组成,分别是: 响应头(状态行+消息报头)+响应正文。

状态行格式如下:

HTTP-Version Status-Code Reason-Phrase CRLF

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

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

2xx:成功–表示请求已被成功接收、理解、接受。

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

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

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

下面是http响应包的例子

guyue: 

      实际使用HTTP Debugger Pro 7.0工具(旧版本在win10上有问题, 不工作), 可以拦截到http的post和get的数据, 发现, 如果在页面中以get方式来传递form表单数据, 浏览器会自动把要传递的表单数据转化为url参数. 即资料中的get方式只能url传参是正确的.   而post方式时, 实测, 可以url传参或者form表单数据传参也行.

      并且发现, 所谓的URL传参, 在HTTP数据包中表现为, 带参数的URL会放到数据包的URL字段中, 没有"请求数据"字段

      而form表单数据传递时候, 表单数据就会放到HTTP数据包中的"请求数据"字段中.

      最后, 用浏览器的控制台也可以捕抓到以上信息, 但是"请求数据"字段在IE浏览器控制台中被称作"请求正文", 可以看出http数据包是有"请求行(request line)(必须)"+"请求头(request header)(必须)" + "请求正文(request content或data)(form表单数据存放地)(可选)"构成

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

不再以讹传讹,GET和POST的真正区别 -- 简明现代魔法  http://www.nowamagic.net/librarys/veda/detail/1919

不再以讹传讹,GET和POST的真正区别

网上的多数答案都是错的

如果有人问你,GET和POST,有什么区别?你会如何回答?

我的经历

前几天有人问我这个问题。我说GET是用于获取数据的,POST,一般用于将数据发给服务器之用。

这个答案好像并不是他想要的。于是他继续追问有没有别的区别?我说这就是个名字而已,如果服务器支持,他完全可以把GET改个名字叫GET2。他反问道,那就是单纯的名字上的区别喽?我想了想,我觉得如果说再具体的区别,只能去看RFC文档了,还要取决于服务器(指Apache,IIS)的具体实现。但我不得不承认,我的确没有仔细看过HTTP的RFC文档。于是我说,我对HTTP协议不太熟悉。这个问题也就结束了。

最普遍的答案

回来之后寻思了很久,他到底是想问我什么?我一直就觉得GET和POST没有什么除了语义之外的区别,自打我开始学习Web编程开始就是这么理解的。

可能很多人都已经猜到了,他要的答案是:

  1. GET使用URL或Cookie传参。而POST将数据放在BODY中。
  2. GET的URL会有长度上的限制,则POST的数据则可以非常大。
  3. POST比GET安全,因为数据在地址栏上不可见。

但是很不幸,这些区别全是错误的,更不幸的是,这个答案还是Google搜索的头版头条,然而我根本没想着这些是答案,因为在我看来他们都是错的。我来一一解释一下。

1. GET和POST与数据如何传递没有关系

GET和POST是由HTTP协议定义的。在HTTP协议中,Method和Data(URL, Body, Header)是正交的两个概念,也就是说,使用哪个Method与应用层的数据如何传输是没有相互关系的。

HTTP没有要求,如果Method是POST数据就要放在BODY中。也没有要求,如果Method是GET,数据(参数)就一定要放在URL中而不能放在BODY中。

那么,网上流传甚广的这个说法是从何而来的呢?我在HTML标准中,找到了相似的描述。这和网上流传的说法一致。但是这只是HTML标准对HTTP协议的用法的约定。怎么能当成GET和POST的区别呢?

而且,现代的Web Server都是支持GET中包含BODY这样的请求。虽然这种请求不可能从浏览器发出,但是现在的Web Server又不是只给浏览器用,已经完全地超出了HTML服务器的范畴了。

知道这个有什么用?我不想解释了,有时候就得自己痛一次才记得住。

2. HTTP协议对GET和POST都没有对长度的限制

HTTP协议明确地指出了,HTTP头和Body都没有长度的要求。而对于URL长度上的限制,有两方面的原因造成:

  1. 浏览器。据说早期的浏览器会对URL长度做限制。据说IE对URL长度会限制在2048个字符内(流传很广,而且无数同事都表示认同)。但我自己试了一下,我构造了90K的URL通过IE9访问live.com,是正常的。网上的东西,哪怕是Wikipedia上的,也不能信。
  2. 服务器。URL长了,对服务器处理也是一种负担。原本一个会话就没有多少数据,现在如果有人恶意地构造几个几M大小的URL,并不停地访问你的服务器。服务器的最大并发数显然会下降。另一种攻击方式是,把告诉服务器Content-Length是一个很大的数,然后只给服务器发一点儿数据,嘿嘿,服务器你就傻等着去吧。哪怕你有超时设置,这种故意的次次访问超时也能让服务器吃不了兜着走。有鉴于此,多数服务器出于安全啦、稳定啦方面的考虑,会给URL长度加限制。但是这个限制是针对所有HTTP请求的,与GET、POST没有关系。

安全不安全和GET、POST没有关系

我觉得这真是中国特色。我讲个小段子,大家应该可以体会出这个说法多么的可笑。

觉得POST数据比GET数据安全的人会说

“防君子不防小人;中国小白多,能防小白用户就行了。”

“哼,”我不以为然,“那你怎么不说,URL参数都Encode过了,或是Base64一下,小白也看不懂啊。”

那人反驳道,“Encode太简单了,聪明点儿的小白很容易就可以Decode并修改掉。”

我笑道,“五十步笑百步耳,再聪明点儿的小白还会截包并重发呢,Opera就有这功能。”

那人阴险地祭出神器——最终解释权,说,“这个不算小白。”

我日啊。

最后一点儿感想

我之前一直做Windows桌面应用,对Web开发无甚了解,直到一年多前转做服务器端开发,才开始接触到HTTP。(注意,我说的是HTTP,不是HTML。服务器开放接口是基于REST理念设计的,使用的协议是HTTP,但是传输的内容不是HTML。这不是Web Server,而是一个Web Service)

所以我对于GET和POST的理解,是纯粹地来源于HTTP协议。他们只有一点根本区别,简单点儿说,一个用于获取数据,一个用于修改数据。具体的请参考RFC文档。

如果一个人一开始就做Web开发,很可能把HTML对HTTP协议的使用方式,当成HTTP协议的唯一的合理使用方式。从而犯了以偏概全的错误。

可能有人会觉得我钻牛角尖。我只是不喜欢模棱两可,不喜欢边界不清、概念不明,不喜欢“拿来主义”,也不喜欢被其它喜欢钻牛角尖的人奚落得无地自容。

“知之为知之,不知为不知,是知也。”

时间: 2024-10-12 13:08:00

http报文格式和post, get方式区别与误区(很不错哦)的相关文章

PHP通过XML报文格式的POST请求方式,与第三方接口交互(发送xml,获取XML,并解析xml步骤)

开发者端:发送请求,并接收结果 <?php // 下面的demo,实现的功能如下: // 1-开发者需要判断一个用户是否存在,去请求第三方接口. // 2-与第三方接口的通信,是以xml格式传送数据.开发者把用户信息以xml格式发送给第三方接口 // 3-第三方接口获取开发者的xml数据,通过数据的查询,把结果再以xml的格式发送给开发者. //首先检测是否支持curl if (!extension_loaded("curl")) { trigger_error("对不

TCP/IP报文格式

一.传输层协议   TCP特点: 面向连接 可靠 适用于可靠性要求高的应用 开销大 UDP特点: 无连接 不可靠 适用于更关注传输效率的应用 可靠性由应用层负责   TCP主要功能:可靠.准确的传输并控制源主机与目的主机之间的信息流: TCP主要职责:提供端到端的控制,通过滑动窗口机制提供流控制,通过序号和确认号机制来保证可靠性: 功能如下: 连接管理:定义了允许两个用户像直接连接一样开始交谈的规则(类似于电话通信之前须拨通对方的号码).通常把连接的定义和建立的过程称为握手. 流量控制:以网络能

HTTP的报文格式、GET和POST格式解析

1. HTTP报文格式 HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的.HTTP有两类报文:请求报文和响应报文.请求报文一个HTTP请求报文由请求行(request line).请求头部(header).空行和请求数据4个部分组成,下图给出了请求报文的一般格式.  (1)请求行请求行由请求方法字段.URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔.例如,GET /index.html HTTP/1.1.HTTP协议的请求方法有GET.PO

HTTP报文结构及Cookie、session区别

目录 万维网 HTTP超文本传输协议 特点 HTTP的报文结构. 下面介绍http请求报文最主要的一些特点 在服务器上存放用户的信息(Cookie) 实例: 工作原理: cookie中的主要内容: Cookie的作用: Cookie的缺陷: Session详解 简介: 工作原理: 作用 Cookie和session的区别 万维网 HTTP超文本传输协议 为了使万维网客户程序与万维网服务器程序之间的交互遵守严格的协议,因此诞生了HTTP超文本传输协议. 特点 位于OSI七层模型的应用层,http是

HTTP POST请求报文格式分析与Java实现文件上传

时间 2014-12-11 12:41:43  CSDN博客 原文  http://blog.csdn.net/bboyfeiyu/article/details/41863951 主题 HTTPHttpComponents 在开发中,我们使用的比较多的HTTP请求方式基本上就是GET.POST.其中GET用于从服务器获取数据,POST主要用于向服务器提交一些表单数据,例如文件上传等.而我们在使用HTTP请求时中遇到的比较麻烦的事情就是构造文件上传的HTTP报文格式,这个格式虽说也比较简单,但也

OSPF报头及各种报文格式

要理解OSPF路由协议的工作原理,特别是路由更新机制,首先就要对它的各种报文格式有一个全面的了解.OSPF报文主要有5种:Hello报文.DD (Database Description,数据库描述)报文.LSR (LinkState Request,链路状态请求)报文.LSU(LinkState Update,链路状态更新)报文和LSAck(LinkState Acknowledgment,链路状态应答)报文.它们各自在OSPF路由更新中所担当的用途不一样,报文格式也存在比较大的差别. 9.2

ARP协议的报文格式 转自n哖苡逅

ARP协议的报文格式 结构ether_header定义了以太网帧首部:结构arphdr定义了其后的5个字段,其信息用于在任何类型的介质上传送ARP请求和回答:ether_arp结构除了包含arphdr结构外,还包含源主机和目的主机的地址. 定义常量 #define EPT_IP   0x0800    /* type: IP */#define EPT_ARP   0x0806    /* type: ARP */#define EPT_RARP 0x8035    /* type: RARP

HTTP请求、响应报文格式

HTTP请求报文格式: HTTP请求报文主要由请求行.请求头部.请求正文3部分组成 1,请求行 由3部分组成,分别为:请求方法.URL(见备注1)以及协议版本,之间由空格分隔 请求方法包括GET.HEAD.PUT.POST.TRACE.OPTIONS.DELETE以及扩展方法,当然并不是所有的服务器都实现了所有的方法,部分方法即便支持,处于安全性的考虑也是不可用的 协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1 2,请求头部 请求头部为请求报文添加了一

DHCP原理及报文格式

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是IETF为实现IP的自动配置而设计的协议,它可以为客户机自动分配IP地址.子网掩码以及缺省网关.DNS服务器的IP地址等TCP/IP参数.了解DHCP工作过程可以帮助我们排除有关DHCP服务遇到的问题.DHCP 协议是基于UDP层(这也就是说在snort检测过程中,只能看UDP的包)之上的应用,dhcp使用udp携带报文,udp封装在ip数据包中发送.我们先来看下dhcp报文格式 OP:若是cl