共计 2835 个字符,预计需要花费 8 分钟才能阅读完成。
阅读原文:一个 HTTP 打趴 80% 面试者
面试一年多,每当我问起面试者对 HTTP 的了解时,个个回答令我瞠目结舌,这些开发者都有 3 - 5 年的经验。请不要让我叫你野生程序员,是时候了解 HTTP 了,让我们当个正规军。
起因
面试官:请问你了解 HTTP 协议吗?
前端开发:这不是应该后端清楚的吗?
后端开发:这不是前端知道的吗?
面试官:……
我们先一本正经的来了解下 HTTP(不包含传输层 TCP),然后总结其中的精华回复面试官。
HTTP 协议简介
HTTP(超文本传输协议)是应用层上的一种客户端 / 服务端模型的通信协议, 它由请求和响应构成,且是无状态的。(暂不介绍 HTTP2)
协议
协议规定了通信双方必须遵循的数据传输格式,这样通信双方按照约定的格式才能准确的通信。
无状态
无状态是指两次连接通信之间是没有任何关系的,每次都是一个新的连接,服务端不会记录前后的请求信息。
客户端 / 服务端模型
五层网络模型
URL 构成
用了这么久,你注意过吗?
协议内容
请求(Request)
客户端发送一个 HTTP 请求到服务端的格式:
请求行
请求头
请求体
响应(Response)
服务端响应客户端格式:
状态行
响应头
响应体
状态码
HTTP 状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP 状态码共分为 5 种类型:
分类
分类描述
1**
信息,服务器收到请求,需要请求者继续执行操作
2**
成功,操作被成功接收并处理
3**
重定向,需要进一步的操作以完成请求
4**
客户端错误,请求包含语法错误或无法完成请求
5**
服务器错误,服务器在处理请求的过程中发生了错误
更详细的状态码可查看 HTTP 状态码
但一般我们只需要知道几个常见的就行,比如 200,400,401,403,404,500,502.
请求方法
截止到 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-Control
取值为一般为 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-urlencoded
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
后台服务器
总结
清楚的知道这些内容,不仅仅是为了应对面试官,而是能实实在在的提高自己的效率,这一点在前后端联调接口最明显, 当你在应用中去请求其他接口或转发请求时这些也是要知道的。不然出现问题的概率会大大提高。