HTTP详解

HTTP报文格式详细解释

HTTP报文是面向文本的,报文中的每一个字段都是ASCII编码串,各个字段的长度是不确定的。HTTP只有两类报文,分别是请求报文和响应报文。

 HTTP 报文是在HTTP 应用程序之间发送的数据块。这些数据块以一些文本形式的元信息(meta-information)开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分。这些报文在客户端、服务器和代理之间流动。

  • HTTP 使用术语流入(inbound)和流出(outbound)来描述事务处理(transaction)的方向
  • 不管是请求报文还是响应报文,所有报文都会向下游(downstream)流动

HTTP请求报文

一个HTTP请求报文由请求行,请求头,请求体三部分组成,他们之间按照换行和回车进行划分下图给出了请求报文的一般格式

 

1.请求行

请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1

HTTP协议的请求方法有GETPOSTHEADPUTDELETEOPTIONSTRACECONNECT

 1.GET请求:

通常用于请求服务器发送某个资源最常见的一种请求方式,当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页的,使用的都是GET方式。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。

例如,/index.jspid=100&op=bind,这样通过GET方式传递的数据直接表示在地址中,所以我们可以把请求结果以链接的形式发送给好友。

2.POST请求:

通常用于向服务器提交数据。表单提交常常用到post,对于上面提到的不适合使用GET方式的情况,可以考虑使用POST方式,因为使用POST方法可以允许客户端给服务器提供信息较多。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中

3.HEAD 

HEAD 方法与GET 方法的行为很类似,但服务器在响应中只返回首部。不会返回实体的主体部分。这就允许客户端在未获取实际资源的情况下,对资源的首部进行检查。

使用HEAD,可以:在不获取资源的情况下

  • 了解资源的情况(比如,判断其类型);
  • 通过查看响应中的状态码,看看某个对象是否存在;
  • 通过查看首部,测试资源是否被修改了。

2.请求头

 

请求头中的关键字段

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

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

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

1 POST请求方式、请求地址、请求所使用的协议和版本
2 Host目标主机地址和端口号
3 Connection: keep-alive维护客户端和服务端的连接关系
4 Content-Length: 68 描述HTTP消息实体的传输长度
5 Accept: application/json, text/javascript, */*; q=0.01发送端(客户端)希望接受的数据类型、q 是权重系数,范围 0 =< q <= 1,q 值越大,请求越倾向于获得其“;”之前的类型表示的内容
6 Origin: http://apptest.zhidianlife.com:8007 浏览器在referrer字段中只显示源网站的源地址(即协议、域名、端口),而不包括完整的路径
7 Authorization: c81e7286507f4aa4b6179f4c381b4c64 请求所需的认证信息
8 User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36客户端版本号的名字
9 Content-Type: application/json请求实体,文档类型
10 Referer: http://apptest.zhidianlife.com:8007/procurement/order?_t=756512&_winid=w9290 从来于哪里
11 Accept-Encoding: gzip, deflate: 客户端接收编码类型,一些网络压缩格式: gzip, deflate
12 Accept-Language: zh-CN,zh;q=0.9客户端接收的语言类型 、中文

请求报文和响应报文的不同

  • 这是请求报文的格式:

<method> <request-URL> <version>

<headers>

<entity-body>

  • 这是响应报文的格式(注意,只有起始行的语法有所不同):

<version> <status> <reason-phrase>

<headers>

<entity-body>

 3.请求体

 空行之后就是可选的报文主体了,其中包含了所有类型的数据。请求主体中包括了要发送给Web 服务器的数据;响应主体中装载了要返回给客户端的数据。起始行和首部都是文本形式且都是结构化的,而主体则不同,主体中可以包含任意的二进制数据(比如图片、视频、音轨、软件程序)。当然,主体中也可以包含文本。

MIME 类型是一种文本标记,表示一种主要的对象类型和一个特定的子类型,中间由一条斜杠来分隔。

 HTML 格式的文本文档由 text/html 类型来标记。

•普通的 ASCII 文本文档由 text/plain 类型来标记。

 JPEG 格式的图片为 image/jpeg 类型。

 GIF 格式的图片为 image/gif 类型。

 Apple 的 QuickTime 电影为 video/quicktime 类型。

•微软的 PowerPoint 演示文件为 application/vnd.ms-powerpoint 类型。

常见的MIME 类型有数百个,实验性或用途有限的MIME 类型则更多。

4.空行

最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。

 HTTP的常见错误状态码

1xx 表示当前本次请求还是持续,没结束
2xx 表示当前本次请求成功
3xx 表示当前本次请求成功,但是服务器进行代理操作/重定向
4xx 表示当前本次请求失败,主要是客户端发生了错误
5xx 表示当前本次请求失败,主要是服务器发生了错误


- 101 Switching Protocols - [*] 协议进行中,一般在http升级到websocket协议的时候就看到 - 200 OK - [GET]:服务器成功返回用户请求的数据 - 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。 - 202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务) - 204 NO CONTENT - [DELETE]:用户删除数据成功。 - 301 Moved Permanently - [*]: 永久重定向 - 302 Move Temporarily - [*]: 临时重定向 - 304 Not Modified - [*]: 命中缓存 - 400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作 - 401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。 - 403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。 - 404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。 - 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。 - 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。 - 422 Unprocesable entity - [POST/PUT/PATCH] 当创建/修改一个对象时,发生一个验证错误。 - 500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。 - 507 Insufficient Storage [POST/PUT/PATCH] 数据存储出错,往往数据库操作错误出错,服务器就返回这个

 

 

关于HTTP请求GET和POST的区别

 

1.GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头<request-line>中),以?分割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提交:把提交的数据放置在是HTTP包的包体<request-body>中。上文示例中红色字体标明的就是实际的传输数据

因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变

2.传输数据的大小:

 首先声明,HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。 而在实际开发中存在的限制主要有:

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

 因此对于GET提交时,传输数据就会受到URL长度的限制。

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

3.安全性:

POST的安全性要比GET的安全性高。注意:这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的Security的含义,比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存, (2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,

 

 
posted @ 2021-06-10 16:43  Fleeting__Time  阅读(152)  评论(0编辑  收藏  举报