HTTP协议简介
HTTP (HyperText Transfer Protocol - 超文本传输协议) 是应用层上的一种 客户端 / 服务端(C / S)模型的通信协议,它由请求和相应构成,且是无状态的。(暂不介绍 HTTP2)
- 协议
协议规定了通信双方必须遵循的数据传输格式,这样通信按照双方约定的格式才能准确的通信 - 无状态
无状态是指两次连接通信之间是没有任何关系的,每次都是一个新的连接,服务端不会记录前后的请求信息 - 客户端 / 服务端模型(C / S)
OSI 七层网络模型与 TCP/IP 四层模型
URL 构成
协议内容
请求(Request)
客户端发送一个 HTTP 请求到服务端的格式:
- 请求行
- 请求头
- 请求体
响应(Response)
服务端相应客户端格式: - 状态行
- 响应头
- 响应体
状态码
HTTP 状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP 状态码共分为 5 种类型:
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
请求方法
截止到 HTTP1.1 共有下面集中方法:
方法 | 描述 |
---|---|
GET | GET请求会显示指定的资源,一般来说 GET 方法应该只用于数据的读取,而不应当用于会产生副作用的非幂等的操作中。它期望的应该是安全的和幂等的。这里的安全指的是,请求不会影响到资源的状态。 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立或已有资源的修改。 |
PUT | PUT请求会向指定资源位置上传其最新内容,PUT 方法是幂等的方法。通过该方法客户端可以将指定资源的最新数据传送给服务器取代指定的资源的内容。 |
PATCH | PATCH 方法出现的较晚,它在 2010 年的 RFC 5789 标准中被定义。PATCH 请求与 PUT 请求类似,同样用于资源的更新。二者有以下两点不同:1.PATCH 一般用于资源的部分更新,而 PUT 一般用于资源的整体更新。2.当资源不存在时,PATCH 会创建一个新的资源,而 PUT 只会对已有资源进行更新。 |
DELETE | DELETE 请求用于请求服务器删除所请求 URI(Uniform Resource Identifier,统一资源标识符)所标识的资源。DELETE 请求后指定资源会被删除,DELETE 方法也是幂等的。 |
OPTIONS | 允许客户端查看服务器的性能。 |
CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头。 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
请求和相应常见通用头
名称 | 作用 |
---|---|
Content-Type | 请求体 / 响应体的类型,如:text/plain、application/json |
Accept | 说明接收的类型,可以多个值,用 , (半角逗号)分开 |
Content-Length | 请求体/响应体的长度,单位字节 |
Content-Encoding | 请求体/响应体的编码格式,如 gzip,deflate |
Accept-Encoding | 告知对方 我方接受的 Content-Encoding |
ETag | 给当前资源的标识,和 Last-Modified、If-None-Match、If-Modified-Since配合,用于缓存控制 |
Cache-Contral | 取值一般为 no-cache 或 max-age=XX,XX 为整数,表示该资源缓存有限期(秒) |
注意
Content-type,内容类型,一般是指网页中存在的 Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。
常见的媒体格式类型如下:
Content-Type(Mime-Type) | 描述 |
---|---|
text/html | HTML 格式 |
text/plain | 纯文本格式 |
text/xml | XML 格式 |
image/gif | gif 图片格式 |
image/jpeg | jpg 图片格式 |
image/png | png 图片格式 |
以 application 开头的媒体格式类型
Content-Type(Mime-Type) | 描述 |
---|---|
application/xml | XML 数据格式 |
application/json | JSON 数据格式 |
application/pdf | pdf 数据格式 |
application/msword | Word 数据格式 |
application/octet-stream | 二进制数据流(如常见的文件下载) |
application/x-www-form-uriencoded | form 表单数据被编码为 key/value 格式发送到服务器(表单默认的提交数据的模式) |
multipart/form-data | 需要在表单中进行文件上传时,就需要使用该格式 |
常见请求头
名称 | 作用 |
---|---|
Authorization | 用于设置身份认证信息 |
User-Agent | 用户标识,如:OS 和浏览器的类型和版本 |
If-Modified-Since | 值为上一次服务器返回的 Last-Modified 值,用于确定某个资源是否被更改过,没有更改过(304)就从缓存中读取 |
If-None-Match | 值为上一次服务器返回的ETag值,一般会和 If-Modified-Since 一起出现 |
Cookie | 已有的 Cookie |
Referer | 表示请求引用自哪个地址,比如你从页面 A 跳转到页面 B 时,值为页面 A 的地址 |
Host | 请求的主机和端口号 |
常见响应头
名称 | 作用 |
---|---|
Date | 服务器的日期 |
Last-Modified | 该资源最后被修改时间 |
Transfer-Encoding | 取值一般为 chunked ,出现在 Content-Length 不能确定的情况下,表示服务器不知道响应体的数据大小,一般同时还会出现 Content-Encoding 响应头 |
Set-Cookie | 设置 Cookie |
Location | 重定向到另一个 URL,如输入浏览器就输入 baidu.com 回车,会自动跳到 https://www.baidu.com,就是通过这个响应头控制的 |
Server | 后台服务器 |
总结
清楚地知道这些内容之后,不仅仅是为了应对面试官,而是能实实际际的在提高自己的效率,这一点在前后端联调借口最明显,当你在应用中去请求其他接口或转发请求时这些也要知道的,不然出现问题的概率会大大提高。
本文转载自 码上实战 公众号,原作者为 flyhero