一, http 简介
http 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写, 用于从万维网 (WWW:World Wide web) 服务器传输超文本到本地浏览器的传送协议.
二, HTTP 工作原理
HTTP 协议工作于客户端 - 服务端架构上. 浏览器作为 HTTP 客户端通过 URL 向 HTTP 服务端即 Web 服务器发送所有请求, Web 服务器根据接受到的请求, 向客户端发送响应信息.
Web 服务器有: Apache 服务器, IIS 服务器等.
HTTP 默认端口号为 80, 可以改为 8080 或者其他端口.
注意:
(1)HTTP 是无连接的: 无连接的含义是每次连接只处理一个请求, 处理完客户端请求, 并收到客户端应答后就断开连接, 这样可以节省传输时间.
(2)HTTP 是媒体独立的: 这意味着, 只要客户端和服务器知道要处理的数据内容, 任何类型的数据都可以通过 HTTP 发送, 客户端和服务器指定合适的 MIME-type 内容类型.
(3)HTTP 是无状态的: HTTP 协议是无状态协议. 无状态是指对于事物处理没有记忆能力. 缺少状态意味着如果后续处理需要前面的信息, 则必须重新传递, 这样导致每次连接传送的数据量增大. 另一方面, 在服务器不需要先前信息时它的应答就较快.
三, HTTP 消息
1.HTTP 消息结构
HTTP 消息是简单的格式化数据块. 每个消息都由三部分组成:
a. 消息起始行, 必需, 消息基本描述信息, 纯 ASCII 字符, 每行以 CRLF 结束
b. 消息头部 / 报头, 可能有 0~n 个, 消息详细属性, 纯 ASCII 字符, 每行以 CRLF 结束
c. 消息主体, 可选, 包含数据的主体, 数据可以为空, 或者是字符数据(如 html,CSS), 二进制数据(如图片, 音视频)
2. 客户端请求消息结构
格式如下:
(1)请求行: 请求方法 空格 请求 URL 空格 协议版本 回车换行
(2)请求头部: 可能包含 0~n 个请求头(名 / 值对) 回车换行
请求头用于描述本身, 客户端, 请求主体的特征, 可分为四种:
------a. 通用头部: 在请求消息或响应消息中都可使用, 如: Connection/Date/Cache-Control/Pragma
------b. 请求专用头部: 只能出现在请求消息中, 如: Host/Referer/User-Agent/Client-IP/Accept/If-Modified-Since/Cookie
------c. 实体头部: 描述消息主体特征, 如: Location/Content-Length/Expires/Last-Modified
------d. 扩展头部: 自定义头部
(3)一个空白行 回车换行
(4)请求主体: 可选, 提交给服务器的请求数据
3. 响应消息结构
HTTP 响应消息也由四部分组成: 状态行, 消息报头, 空行, 响应正文.
(1)响应行: 协议版本 空格 状态码 空格 原因短语 回车
(2)响应头部: 可能包含 0~n 个响应头(名 / 值对) 回车
响应头用于描述响应本身, 服务器, 响应主体的特征, 可分为四种:
------a. 通用头部: 在请求消息或响应消息中都可使用, 如: Connection/Date/Cache-Control/Pragma
------b. 响应专用头部: 只能出现在响应消息中, 如: Age/Server
------c. 实体头部: 描述消息主体特征, 如: Location/Content-Length/Expires/Last-Modified
------d. 扩展头部: 自定义头部
(3)一个空白行 回车
(4)响应主体: 可选, 返回给客户端的响应数据, 可能是字符数据, 也可能是字节数据
- axios({
- method: 'post',
- url: '/user/12345',
- headers:{
- 'Content-Type':'application/x-www-form-urlencoded'
- },
- data: {
- firstName: 'Fred',
- lastName: 'Flintstone'
- }
- });
- //method 和 url 就是请求行信息
- //headers 中的属性就是请求头
- //data 中的就是请求主体
四, HTTP 请求方法
方法 | 描述 |
---|---|
GET | 用于请求访问已经被 URL(统一资源标识符)识别的资源,可以通过 URL 传参给服务器 |
HEAD | 类似于 get 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
POST | 向指定资源提交数据进行处理请求,数据包含在请求体中 |
PUT | 从客户端向服务器传送的数据取代指定的文档内容 |
DELETE | 请求服务器删除指定页面 |
CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器 |
OPTIONS | 决定可以在服务器执行哪些方法 |
TRACE | 对可能经过代理服务器传送到服务器上的信息进行追踪 |
五, GET 方法与 POST 方法的区别
1. 注重点
get 方式重点在从服务器上获取资源, post 方式重点在向服务器发送数据
2. 传输数据的方式
get 方式传输数据是通过 URL 请求, 以 key=value 的形式, 置于 URL 后, 并用 '?' 连接, 多个 key=value 以'&'连接;
post 方式传输数据通过 http 的 post 机制, 将字段与对应值封存在请求实体中发送给服务器, 这个过程对用户是不可见的.
3. 传输数据的大小
get 方式传输的数据量小, 是因为受 URL 长度限制, 但是效率高; post 方式可以传输大量数据, 上传文件时只能用 post 方式.
4. 安全性
get 方式是不安全的, 因为 URL 是明文可见的, 可能会泄露私密信息; post 方式比 get 方式的安全性高, 因为传输的数据不可见.
5. 支持的字符
get 方式只能支持 ASCII 字符, 向服务器传输的中文字符可能会乱码; post 方式支持标准字符集, 可以正确传递中文字符.
六, 常见状态码及原因
分类 | 描述 |
---|---|
1xx | 指示信息 - 表示请求已接收,继续处理 |
2xx | 成功 - 表示请求已被成功接收 |
3xx | 重定向 - 要完成任务必须进行更进一步的操作 |
4xx | 客户端错误 - 请求有语法错误或请求无法实现 |
5xx | 服务器端错误 - 服务器未能实现合法的请求 |
状态码 | 状态码英文名称 | 中文描述 |
---|---|---|
100 | Continue | 继续,客户端继续请求 |
200 | OK | 请求成功,一般用于 get 或 post 请求 |
304 | Not Modified | 未修改,请求资源未修改,服务器端不会返回任何资源,客户端使用缓存资源 |
305 | Use Proxy | 使用代理,请求的资源必须通过代理访问 |
400 | Bad Request | 客户端请求的语法错误,服务器无法理解 |
403 | Forbidden | 服务器理解客户端请求,但拒接执行 |
404 | Not Found | 请求的资源不存在 |
405 | Method Not Allowed | 发起的请求中带有 URL 中不支持的方法 |
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
505 | HTTP Version not supported | 服务器不支持请求的 HTTP 版本,无法完成处理 |
七, 内容类型与常用内容类型
实体头部中的 Content-Type 头可用于指定消息主体中的数据内容类型(MIME 类型).
常见 MIME 类型:
扩展名 | MIME 类型 |
---|---|
html | text/html |
js | application/javascript |
css | text/css |
txt | text/plain |
json | application/json |
xml | application/xml |
doc | application/msword |
jpeg | image/jpeg |
mp3 | audio/mpeg |
八, 缓存控制相关头部
1. 缓存工作原理
客户端可以自动保存已经访问过的文档的副本, 这些副本就成为 "文档缓存". 当客户端再次发送针对同一个 URL 的请求时, 如果本地有 "已缓存的副本", 就可以直接从本地存储设备而不是远程服务器提取该文档了.
2.Cache-Control 头
Cache-Control:max-age 头部表示从服务器将文档传来之时起, 可以认为此文档处于新鲜状态的秒数, 如: Cache-Control:max-age=3600.
服务器可以将请求客户端不要缓存文档, 或者将最大使用期设置为 0, 从而在每次访问的时候都进行刷新, 如: Cache-Control:max-age=0.
客户端在事先没有跟原始服务器进行再验证的情况下, 不能提供对应数据的陈旧副本. 但缓存仍然可以提供新鲜的副本, 如: Cache-Control:must-revalidate.
3.Expires 头
Expires 头部指定缓存的过期确切时间. HTTP 设计者认为, 由于很多服务器的时钟都不同步, 所有推荐最好使用剩余秒数来代替过期的绝对时间.
如果希望客户端不要缓存资源, 可以将过去时间设置为一个过去的时间, 如: Expires:Sat,01 Jun 1970, 08:00:00 GMT
4. 控制 HTTP 头部的方法
(1)修改 web 服务器的配置文件, 设置默认响应头部.
(2)设置每个 HTML 文件的 HTTP-EQUIV 标签控制缓存, 如:
<html>
<head>
<meta http-equiv="Cache-Control" content="no-cache">
</head>
</html>
5. 数据缓存的优点
a. 减少了冗余的数据传输, 节省客户端流量费用
b. 缓解服务器带宽瓶颈问题, 服务器可以节省出更多的带宽
c. 降低了对服务器的资源消耗和运行要求
d. 降低了由于远距离而造成的加载延时
九, HTTP 链接性能优化
网站性能优化最主要的就是减少 HTTP 请求及每次响应中内容的长度. 可以从连接过程中的下列方法中考虑:
(1)域名解析: 尽可能的减少域名解析次数 -- 减少跨站外部资源的引用
(2)创建连接: 努力减少连接创建次数 -- 使用 Keep-Alive 避免重复连接
(3)发送请求: 尽量减少请求次数 -- 合理设置 Expires 时间, 资源合并
(4)等待响应: 提高服务器端运行速度 -- 提高数据运算及查询速度
(5)接受响应: 尽可能减小响应数据长度 -- 启用压缩
来源: http://www.qdfuns.com/article/46690/7969acf684c5063d85086ced47675c36.html