iOS Daily Tip - HTTP请求/响应报文结构

2018-09-10  本文已影响119人  过客又见过客

HTTP请求报文

一个HTTP请求报文由四个部分组成:请求行、请求头部、空行、请求数据(请求正文)。

总的来说,HTTP请求报文格式就如下图所示:

请求报文图片1.png 请求报文图片2.jpg

上面是POST方法,它的请求行URL段中一般是没有参数的,参数放在了报文体中。而GET方法的参数直接置于请求行URL中,报文体则为空。

HTTP响应报文

HTTP响应报文也由三部分组成:响应行、响应头、响应体。

HTTP响应报文格式就如下图所示:
Http响应报文格式.jpg

通用头、实体头

通用头域

通用头域包含请求和响应消息都支持的头域,通用头域包含Cache-Control、 Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。对通用头域的扩展要求通讯双方都支持此扩展,如果存在不支持的通用头域,一般将会作为实体头域处理。下面简单介绍几个通用头域。

常见通用头含义:

Cache-Control:指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置 Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。各个消息中的指令含义如下:

Public指示响应可被任何缓存区缓存。 Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。 no-cache指示请求或响应消息不能缓存 no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。 max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。 min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。 max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

Date:表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。

Pragma:用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同。

实体头域

请求消息和响应消息都可以包含实体信息,实体信息一般由实体头域和实体组成。实体头域包含关于实体的原信息,实体头包括Allow、Content- Base、Content-Encoding、Content-Language、 Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、 Etag、Expires、Last-Modified、extension-header。extension-header允许客户端定义新的实体头,但是这些域可能无法未接受方识别。实体可以是一个经过编码的字节流,它的编码方式由Content-Encoding或Content-Type定义,它的长度由Content-Length或Content-Range定义。

常见实体头含义:

Content-Encoding: 服务器通过这个头告诉浏览器数据的压缩格式。

Content-Length: 服务器通过这个头告诉浏览器回送数据的长度。

Content-Disposition:告诉浏览器以下载方式打开数据。

Content-Type:服务器通过这个头告诉浏览器回送数据的类型。Content-Type实体头用于向接收方指示实体的介质类型,指定HEAD方法送到接收方的实体介质类型,或GET方法发送的请求介质类型。

Content-Range:用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式:

Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth

例如,传送头500个字节次字段的形式:Content-Range:bytes0- 499/1234,如果一个http消息包含此节(例如,对范围请求的响应或对一系列范围的重叠请求),Content-Range表示传送的范围, Content-Length表示实际传送的字节数。

Last-Modified:指定服务器上保存内容的最后修订时间。

ETag:缓存相关的头

Expires:告诉浏览器把回送的资源缓存多长时间 -1或0则是不缓存

其中三种禁止浏览器缓存的头字段:

Expires:-1或0

Cache-Control:no-cache

Pragma:no-cache

GET与POST区别

Http定义了与服务器交互的不同方法,最基本的方法有4种:GET、POST、PUT、DELETE。

而HTTP中的 GET,POST,PUT,DELETE 就对应着对URL资源的 查,改,增,删 4个操作。所以说:GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

主要区分一下get和post:

  1. 提交数据的形式:

    GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),会直接展现在地址栏中,以?分割URL和传输数据,参数之间以&相连,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5 %A5%BD。

    如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,

    得出如:%E4 %BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

    而POST方法则会把数据放到请求数据字段中以&分隔各个字段,请求行不包含数据参数,地址栏也不会额外附带参数

  2. 提交数据的大小

    get方法提交数据的大小直接影响到了URL的长度,但HTTP协议规范中其实是没有对URL限制长度的,限制URL长度的是客户端或服务器的支持的不同所影响:比如IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。

    post方式HTTP协议规范中也没有限定,起限制作用的是服务器的处理程序的处理能力。

    所以大小的限制还是得受各个web服务器配置的不同而影响。

  3. 提交数据的安全

    POST比GET方式的安全性要高

    通过GET提交数据,用户名和密码将明文出现在URL上,因为一下几个原因get方式安全性会比post弱:

    (1)登录页面有可能被浏览器缓存

    (2)其他人查看浏览器的历史纪录,那么别人就可 以拿到你的账号和密码了

    (3)当遇上跨站的攻击时,安全性的表现更差了

文章转载,点击查看原文

上一篇下一篇

猜你喜欢

热点阅读