在项目实际开发中,前端页面调用后台接口,渲染数据到页面是非常常见的场景,。调用后台接口,从服务器获取数据的时候,可能会出现很多情况,比如404 not found,了解这些http状态码可以帮助我们排查问题。
-
分类
状态码 响应类型 原因短语 1xx 信息性状态码 服务器正在处理请求 2xx 成功状态码 请求已正常处理完毕 3xx 重定向状态码 需要进行额外操作以完成请求 4xx 客户端错误状态码 客户端原因导致服务器无法处理请求 5xx 服务器错误状态码 服务器原因导致处理请求出错 -
常见状态码
- 1xx
- 100 继续,客户端应继续请求
- 101 切换协议,服务端根据客户端请求切换协议,只能切换到更高级的协议
- 2xx
- 200 请求成功,一般用于GET和POST请求
- 201 成功请求,并创建了新资源
- 202 已接收请求,但未处理完成
- 203 请求成功,但返回的meta信息不在原始服务器,而是一个副本
- 204 服务器处理成功,但未返回内容
- 205 服务器处理成功,用户终端应重置文档视图
- 206 服务器成功处理了部分请求
- 3xx
- 301 永久移动
- 302 临时移动
- 303 查看其它地址,使用GET和POST请求查看
- 304 未修改(浏览器缓存)
- 305 使用代理,所请求的资源必须通过代理访问
- 307 临时重定向,使用GET请求重定向
- 4xx
- 400 客户端请求的语法错误,服务器无法理解
- 401 请求要求用户的身份认证
- 403 服务器理解客户端的请求,但是拒绝执行此请求
- 404 服务端无法根据客户端的请求找到资源
- 5xx
- 500 服务器内部错误,无法完成请求
- 501 服务器不支持请求的功能,无法完成请求
- 502 作为网关或代理工作的服务器尝试执行请求时,从远程服务器接收到一个无效的响应
- 503 由于超载和系统维护,服务器暂时的无法处理客户端的请求
- 504 充当网关或代理的服务器,未及时从远端服务器获取请求
- 505 服务器不支持请求的HTTP协议的版本,无法完成请求
-
常问问题
-
301和302的区别
301为永久重定向,如果用户把该资源对象的URI保存为书签的话,书签中的网址会被更新
-
浏览器缓存机制(HTTP缓存机制)
浏览器每次发送请求之后,都会在浏览器缓存中查看该请求的结果和缓存标识;浏览器每次拿到返回的请求结果之后,都会将该结果和缓存标识存入浏览器缓存中。
-
强制缓存
-
当不存在请求结果和缓存标志的时候,向服务器发送请求,请求资源
-
当存在请求结果和缓存标识,但是结果失效,则协商缓存
-
当存在请求结果和缓存标识,且结果未失效,直接返回该结果
浏览器控制强缓存的字段分别是
Expires
(http/1.0)和Cache-Control
(http/1.1),Cache-Control
优先级高于Expires
,http/1.1中默认使用Cache-Control
,因为Expires
通过到期时间判断的判断机制,可能因为市区等原因导致偏差,所以http/1.1采用Cache-Control
来控制强制缓存。
Cache-Control
取值情况如下:public 所有内容都被缓存(客户端和代理服务器)
private 所有内容只有客户端缓存(默认取值)
no-cache 协商缓存
no-store 不缓存
max-age=xxx 缓存内容在xxx秒后失效
-
-
协商缓存
缓存结果失效后,浏览器携带缓存标志向服务器发起请求,由服务器根据缓存标识判断是否使用缓存
-
协商缓存失效
返回304,该资源无法更新
-
协商缓存成功
返回200和请求结果
浏览器控制协商缓存的字段分别为
Last-Modified
/If-Modified-Since
(http/1.0)、Etag
/If-None-Match
(http/1.1),其中Etag
/If-None-Match
比Last-Modified
/If-Modified-Since
优先级高Last-Modified 资源文件在服务器最后被修改的时间
If-Modified-Since 上次请求返回的Last-Modified值,如果Last-Modified大于该值,则返回200和结果,否则返回304,无法更新资源,使用缓存文件
Etag 资源文件唯一标识(由服务器生成)
If-None-Match 上一次请求返回的Etag 值,如果Etag不等于该值,则返回200和结果,否则返回304,无法更新资源,使用缓存文件
-
-
-
http1.0和http1.1的区别
- 浏览器缓存处理,http1.0通过
Last-Modified
/If-Modified-Since
和Expires
等字段控制浏览器缓存,http1.1通过Etag
/If-None-Match
和Cache-Control
等字段控制浏览器缓存。 - 带宽优化及网络连接的使用,http1.0存在一些带宽浪费的情况,例如客户端只需要某个对象的额一部分,而服务器却把整个资源送过来,并且不支持断点续存功能;http1.1则在请求头中引入了range头域,允许请求资源的某个部分,则返回码是206,这样方便了开发者自由选择以便于利用带宽和连接。
- 错误通知管理,在http1.1中新增了24个错误状态码,如409,表示请求的资源与资源的当前状态发生冲突,410,表示服务器上的某个资源被永久删除。
- host头处理,http1.0认为每台服务器都绑定一个唯一的IP地址,因此请求消息中的URL并没有传递主机名,随着虚拟技术的发展,一台物理服务器可以存在多个虚拟主机,并且共享一个IP地址。http1.1的请求消息和响应消息都应支持host头域,请求消息中如果没有host头域,会报400错误。
- 长连接,http1.1支持长连接和请求的流水线处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在http1.1中默认开启Connection:keep-alive,一定程度上弥补了http1.0每次请求都要创建连接的缺点。
- 浏览器缓存处理,http1.0通过
-
http1.x和http2.0的区别
-
新的二进制格式
http1.x的解析是基于文本的,基于文本的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多;二进制则不同,只认0和1的组合,http2.0采用二进制格式比较方便和健壮。
-
多路复用
即连接共享,每一个request都是用作连接共享机制的,一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的id将request归属到各自不同的服务端请求里。
-
header压缩
http1.x的header带有大量信息,而且每次都要重复发送,http2.0使用encoder来减少要传输的header的大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减少了需要传输的大小。
-
服务端推送
采用了SPDY的网页,例如我的网页有一个sytle.css的请求,在客户端收到sytle.css数据的同时,服务端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js时就可以直接从缓存中获取到,不用再发请求了。
SPDY位于HTTP之下,TCP和SSL之上,这样可以轻松兼容老版本的HTTP协议(将HTTP1.x的内容封装成一种新的frame格式),同时可以使用已有的SSL功能。
-
-
http和https的区别和联系
- http协议运行在TCP之上,所有的传输都是明文,https运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都是经过加密的。
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者80,后者443。
- https可以有效的防止运营商劫持,解决了防劫持的一个大问题。
- https协议需要CA申请证书,一般免费证书很少,需要付费。
-
- 1xx