前端需要知道的HTTP协议
文章目录
一.简介
HTTP是一种超文本传输协议,HTTP是一个在计算机世界里专门在两点之间传输文字,图片,音频,视频等超文本数据的约定和规范
二.HTTP协议主要特点
简单快速,灵活,无连接,无状态
(1) HTTP是无连接的
无连接的含义是限制每次连接只处理一个请求,服务器处理完客户端的请求,并收到客户端的应答后,即断开连接.采用这种方式可以节省传输时间
PS:HTTP/1.1里改成总是默认启用keep-live长连接机制,所以现在的HTTP已经不再是无连接的了
(2) HTTP是媒体独立的
这意味着,只要客户端和服务端知道如何处理数据的内容,任何类型的数据都可以通过HTTP传输,客户端以及服务端指定适合的MIME-type内容类型即可
(3) HTTP是无状态的
HTTP协议是无状态协议,无状态是指协议对于事物处理没有记忆能力,缺少状态,意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传输的数据量增大,另外,在服务器不需要先前信息时,它的应答就较快.
通过Cookie,Session解决无状态
三.HTTP报文
1.请求报文
一个HTTP请求报文由请求行(request line),请求头(header),空行和请求数据4部分组成
1.1.请求行(request line)
包括请求方法字段,URL字段和HTTP协议版本.比如GET /index.html HTTP/1.1。
1.2.请求头(header)
头部字段是key-value的形式,以键值对的形式组成,每行一对,请求头部通知服务器有关客户端请求的信息,典型的请求头有:
| 字段 | 含义 |
|---|---|
| Accept | 浏览器可以接受的MIME类型application/json text/plain
|
| Accept-Charset | 浏览器可以接受的字符集 unicode-1-1
|
Accept-Encoding |
浏览器能够进行解码的数据编码方式,比如gzip, deflate, br. 服务端能够向支持gzip的浏览器返回经gzip编码的HTML页面,许多情形下,可以减少5到10倍的下载时间(性能优化的一个手段) |
| Accept-Language | 浏览器所希望的语言种类,当服务器能提供一种以上的语言版本时要用到 zh-CN,zh;q=0.9,en;q=0.8
|
Authorization |
授权信息,通常我们一般会把token信息存入这个字段 |
| Content- Length | 表示请求消息正文的长度.比如我们上传文件的时候,后端经常会通过这个字段判断文件大小,特别是分片上传的时候 |
| Content-Type | 请求的数据格式,用于POST和PUT请求中,比如:Content-Type: application/x-www-form-urlencoded
|
Host |
客户机通过这个头告诉服务器,想问的主机名.也就是请求的主机名,Host头域指定请求资源的主机和端口号,允许多个域名同处一个IP地址,即虚拟主机 |
If-Modified-Since |
资源缓存的时间,只有当请求的内容在指定的时间后,又经过修改才返回它,否则返回304状态码(性能优化中协商缓存的一个重要字段) |
Referer |
客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的(防盗链),包含一个URL,表示从哪一个URL出发访问到当前请求的页面的.(通常会做图片处理,比如:当前图片来自哪里,未经允许,不得转载) |
User-Agent |
发出请求的浏览器类型,通常我们判断该用户使用的浏览器类型时,非常有用 |
Connection |
处理完这次请求之后是否断开连接还是继续保持连接.HTTP 1.1默认使用持久连接,也就是keep-alive,利用长连接的优点,当页面包含多个元素时(图片),显著的减少下载所需要的时间. 注意:HTTP 1.1之前是无连接的
|
| Cookie | 携带到服务器的Cookie字段 |
| If-None-Match | 服务器上次返回的资源的唯一标识,一个hash值,比较标记,本地资源未修改,返回304(性能优化中协商缓存的一个重要字段)
|
| Range | 表示只请求实体的一个或者多个子范围.通常我们做断电续传的时候,会用到.断点续传也就是从文件已经下载的地方开始继续下载 |
1.3.空行
它的作用是通过一个空行,告诉服务器请求头部到此为止
1.4.请求体
若方法是GET,则此项为空,没有数据
若方法是POST,则通常来说此处放置的就是要提交的数据
比如要使用POST方法提交一个表单,其中有user字段中数据为admin, password字段为123456,那么这里的请求数据就是 user=admin&password=123456,使用&来连接各个字段。
2.响应报文
响应报文由状态行,响应头,空行,响应正文组成
2.1.状态行
包含HTTP协议的版本,状态码,以及描述(作为数字状态码的补充,是更详细的解释文字,帮助人理解原因)
2.2.响应头
| 字段(响应头) | 说明 | 示例 |
|---|---|---|
| Access-Control-Allow-Origin | 指定哪些网站可以跨域源资源共享 | Access-Control-Allow-Origin: * |
| Age | 响应对象在代理缓存中存在的时间,以秒为单位 | Age: 12 |
| Allow | 对于特定资源的有效动作; | Allow: GET, HEAD |
Cache-Control |
通知从服务器到客户端内的所有缓存机制,表示它们是否可以缓存这个对象及缓存有效时间。其单位为秒(性能优化中,强缓存的一个重要字段) |
Cache-Control: max-age=3600 |
| Connection | 针对该连接所预期的选项 | Connection: close |
| Content-Disposition | 对已知MIME类型资源的描述,浏览器可以根据这个响应头决定是对返回资源的动作,如:将其下载或是打开。 | Content-Disposition: attachment; filename=“fname.ext” |
| Content-Encoding | 响应资源所使用的编码类型。 | Content-Encoding: gzip |
| Content-Language | 响就内容所使用的语言 | Content-Language: zh-cn |
| Content-Length | 响应消息体的长度,用8进制字节表示 | Content-Length: 348 |
| Content-Range | 如果是响应部分消息,表示属于完整消息的哪个部分 | Content-Range: bytes 21010-47021/47022 |
| Content-Type | 当前内容的MIME类型 | Content-Type: text/html; charset=utf-8 |
| Date | 此条消息被发送时的日期和时间(以RFC 7231中定义的"HTTP日期"格式来表示) | Date: Tue, 15 Nov 1994 08:12:31 GMT |
| ETag | 服务器会返回当前资源的唯一标识! hash值(性能优化中协商缓存机制的一个重要字段) |
ETag: “737060cd8c284d8af” |
| Expires | Expires的值为服务端返回的到期时间,Expires是HTTP 1.0的内容(性能优化中强缓存为了兼容HTTP 1.0版本的一个缓存时间) |
Expires: Thu, 01 Dec 1994 16:00:00 GMT |
| Last-Modified | 服务器在响应请求时,告诉浏览器资源的最后修改时间(性能优化中协商缓存机制的一个重要字段) |
Last-Modified: Dec, 26 Dec 2015 17:30:00 GMT |
| Server | 服务器的名称 | Server: nginx/1.6.3 |
2.3.空行
最后一个响应头部之后是一个空行,发送回车符和换行符,通知服务器以下不再有响应头部。
2.4.响应体
响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是JS就是JS代码,如此之类。
四.HTTP方法
1.GET
用于请求访问已经被URI识别的资源,可以通过URL传参给服务器
2.POST
用于传输信息给服务器,主要功能与get方法类似,但一般推荐使用POST方式
3.PUT
传输文件,报文主体中包含文件内容,保存到对于URI位置。
4.HEAD
获得报文首部,与get方法类似,只是不返回报文主体,一般用于验证URI是否有效
5.DELETE
删除文件,与PUT方法类似,删除对应URI位置的文件
6.OPTIONS
查询相应URI支持的HTTP方法
五.HTTP状态码
HTTP状态码的英文为HTTP Status Code。状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。
1. 1XX
指示信息:表示请求已经接收,继续处理
2. 2XX
成功:表示请求已经被成功接收,理解,接收
3. 3XX
重定向:表示要完成请求,必须进一步操作
4. 4XX
客户端错误:请求有语法错误或请求无法实现
5. 5XX
服务端错误:服务器未能实现合法的请求
6.常见状态码
| 状态码 | 英文标识 | 描述 |
|---|---|---|
| 200 | OK | 表示从客户端发送给服务器的请求被正常处理并返回; |
| 204 | No Content | 表示客户端发送给客户端的请求得到了成功处理,但在返回的响应报文中不含实体的主体部分(没有资源可以返回) |
| 206 | Patial Content | 表示客户端进行了范围请求,并且服务器成功执行了这部分的GET请求,响应报文中包含由Content-Range指定范围的实体内容。 |
| 301 | Moved Permanently |
永久性重定向,表示请求的资源被分配了新的URL,之后应使用更改的URL; |
| 302 | Found | 临时性重定向,表示请求的资源被分配了新的URL,希望本次访问使用新的URL;301与302的区别:前者是永久移动,后者是临时移动(之后可能还会更改URL) |
| 303 | See Other | 表示请求的资源被分配了新的URL,应使用GET方法定向获取请求的资源 302与303的区别:后者明确表示客户端应当采用GET方式获取资源 |
| 304 | Not Modified |
协商缓存,返回的状态码 |
| 400 | Bad Request | 表示请求报文中存在语法错误;
|
| 401 | Unauthorized | 未经许可,需要通过HTTP认证; |
| 403 | Forbidden | 拒绝访问,没有权限 |
| 404 | Not Found | 无法找到请求的资源,举个例子:输入了错误的URL。 |
| 500 | Inter Server Error | 表示服务器在执行请求时发生了错误,也有可能是web应用存在的bug或某些临时的错误时; |
| 503 | Server Unavailable | 表示服务器暂时处于超负载或正在进行停机维护,无法处理请求 |