前端面试题 - 请求
http 状态码
100-199:用于指定客户端相应的某些动作,服务器接收到请求,需要请求者继续执行操作
200-299:用于表示请求成功
300-399:用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。重定向,需要进一步的操作以完成请求
400-499:用于指出客户端的错误,请求包含语法 错误或无法完成请求。400 - 客户端请求语法有错误,服务器无法理解;401 - 当前请求需要用户验证;403 - 服务器理解请求客户端的请求,但是拒绝执行此请求;404 - 服务器无法根据客户端的请求找到资源(网页)
500-599:服务器端错误。500 - 服务器内部错误,无法完成请求;501 - 服务器不支持请求的功能;502 - 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求;503 - 服务不可用
Ajax 中 GET 和 POST 方法的区别
GET 和 POST 都是向服务器发送的一种请求,只是发送机制不同
- GET 请求会将参数跟在 URL 后进行传递,而 POST 请求则是作为 HTTP 消息的实体内容发送给 WEB 服务器。当然在 Ajax 请求中,这种区别对用户是不可见的 
- 首先是 GET 方式提交的数据最多只能是 1024 字节,因为 GET 是通过 URL 提交数据,那么 GET 可提交的数据量就跟 URL 的长度有直接关系了。而实际上,URL 不存在参数上限的问题,HTTP 协议规范没有对 URL 长度进行限制。*这个限制是特定的浏览器及服务器对它的限制*。IE 对 URL 长度的限制是 2083 字节(2K+35)。对于其他浏览器,如 Netscape、FireFox 等,理论上没有长度限制,其限制取决于操作系统的支持。注意这是限制是整个 URL 长度,而不仅仅是你的参数值数据长度 
- GET 方式请求的数据会被浏览器缓存起来,因此其他人就可以从浏览器的历史记录中读取到这些数据,例如账号和密码等。在某种情况下,GET 方式会带来严重的安全问题。而 POST 方式相对来说就可以避免这些问题 
GET 请求和 POST 请求在服务器端的区别
- 在客户端使用 GET 请求时,服务器端使用 Request.QueryString 来获取参数,而客户端使用 POST 请求时,服务器端使用 Request.Form 来获取参数 
- HTTP 标准包含这两种方法是为了达到不同的目的。POST 用于创建资源,资源的内容会被编入 HTTP 请示的内容中。例如,处理订货表单、在数据库中加入新数据行等 当请求无副作用时(如进行搜索),便可使用 GET 方法;当请求有副作用时(如添加数据行),则用 POST 方法。一个比较实际的问题是:GET 方法可能会产生很长的 URL,或许会超过某些浏览器与服务器对 URL 长度的限制 
若符合下列任一情况,则用 POST 方法
- 请求的结果有持续性的副作用,例如,数据库内添加新的数据行
- 若使用 GET 方法,则表单上收集的数据可能让 URL 过长
- 要传送的数据不是采用 7 位的 ASCII 编码
若符合下列任一情况,则用 GET 方法
- 请求是为了查找资源,HTML 表单数据仅用来帮助搜索
- 请求结果无持续性的副作用
- 收集的数据及 HTML 表单内的输入字段名称的总长不超过 1024个 字符
HTTP 类型
HTTP 协议类型有 8 种,分别是
- OPTIONS:返回服务器针对特定资源所支持的 HTTP 请求方法。也可以利用向 Web 服务器发送 * 的请求来测试服务器的功能性 
- HEAD:向服务器索要与 GET 请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息 
- GET:向特定的资源发出请求 
- POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的创建和 / 或已有资源的修改 
- PUT:向指定资源位置上传其最新内容 
- DELETE:请求服务器删除 Request-URI 所标识的资源 
- TRACE:回显服务器收到的请求,主要用于测试或诊断 
- CONNECT:HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器 
PUT 和 POST 的区别
PUT 和 POST 的技术实现上应该是没有很大区别的。但在于协议上语义是很大区别
PUT 的方法就是其字面表意,将 client 的资源放在请求 URI 上。对于服务器到底是*创建*还是*更新*,由服务器返回的 HTTP Code 来区别。如果用 PUT 来达到更改资源,需要 client 提交资源全部信息,如果只有部分信息,不应该使用 PUT(因为服务器使用 client 提交的对象整体替换服务器的资源)
基本上不能方便的归纳为*增删改*之类的行为,都可以使用 POST 方法。另外可以使用 POST 去实现部分更新资源
HTTP 状态码有那些?分别代表是什么意思?
简单版
- 100 Continue 继续,一般在发送 post 请求时,已发送了 http header 之后服务端将返回此信息,表示确认,之后发送具体参数信息
- 200 OK 正常返回信息
- 201 Created 请求成功并且服务器创建了新的资源
- 202 Accepted 服务器已接受请求,但尚未处理
- 301 Moved Permanently 请求的网页已永久移动到新位置
- 302 Found 临时性重定向
- 303 See Other 临时性重定向,且总是使用 GET 请求新的 URI
- 304 Not Modified 自从上次请求后,请求的网页未修改过
- 400 Bad Request 服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求
- 401 Unauthorized 请求未授权
- 403 Forbidden 禁止访问
- 404 Not Found 找不到如何与 URI 相匹配的资源
- 500 Internal Server Error 最常见的服务器端错误
- 503 Service Unavailable 服务器端暂时无法处理请求(可能是过载或维护)
完整版
1** (信息类):表示接收到请求并且继续处理
  100 — 客户必须继续发出请求
  101 — 客户要求服务器根据请求转换 HTTP 协议版本
2** (响应成功):表示动作被成功接收、理解和接受
  200 — 表明该请求被成功地完成,所请求的资源发送回客户端
  201 — 提示知道新文件的 URL
  202 — 接受和处理、但处理未完成
  203 — 返回信息不确定或不完整
  204 — 请求收到,但返回信息为空
  205 — 服务器完成了请求,用户代理必须复位当前已经浏览过的文件
  206 — 服务器已经完成了部分用户的 GET 请求
3** (重定向类):为了完成指定的动作,必须接受进一步处理
  300 — 请求的资源可在多处得到
  301 — 本网页被永久性转移到另一个 URL
  302 — 请求的网页被转移到一个新的地址,但客户访问仍继续通过原始 URL 地址,重定向,新的 URL 会在 response 中的 Location 中返回,浏览器将会使用新的 URL 发出新的 Request
  303 — 建议客户访问其他 URL 或访问方式
  304 — 自从上次请求后,请求的网页未修改过,服务器返回此响应时,不会返回网页内容,代表上次的文档已经被缓存了,还可以继续使用
  305 — 请求的资源必须从服务器指定的地址得到
  306 - 前一版本 HTTP 中使用的代码,现行版本中不再使用
  307 — 申明请求的资源临时性删除
4** (客户端错误类):请求包含错误语法或不能正确执行
  400 — 客户端请求有语法错误,不能被服务器所理解
  401 — 请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用
  HTTP 401.1 - 未授权:登录失败
    HTTP 401.2 - 未授权:服务器配置问题导致登录失败
    HTTP 401.3 - ACL 禁止访问资源
    HTTP 401.4 - 未授权:授权被筛选器拒绝
    HTTP 401.5 - 未授权:ISAPI 或 CGI 授权失败
  402 — 保留有效 ChargeTo 头响应
  403 — 禁止访问,服务器收到请求,但是拒绝提供服务
  HTTP 403.1 禁止访问:禁止可执行访问
    HTTP 403.2 - 禁止访问:禁止读访问
    HTTP 403.3 - 禁止访问:禁止写访问
    HTTP 403.4 - 禁止访问:要求 SSL
    HTTP 403.5 - 禁止访问:要求 SSL 128
    HTTP 403.6 - 禁止访问:IP 地址被拒绝
    HTTP 403.7 - 禁止访问:要求客户证书
    HTTP 403.8 - 禁止访问:禁止站点访问
    HTTP 403.9 - 禁止访问:连接的用户过多
    HTTP 403.10 - 禁止访问:配置无效
    HTTP 403.11 - 禁止访问:密码更改
    HTTP 403.12 - 禁止访问:映射器拒绝访问
    HTTP 403.13 - 禁止访问:客户证书已被吊销
    HTTP 403.15 - 禁止访问:客户访问许可过多
    HTTP 403.16 - 禁止访问:客户证书不可信或者无效
    HTTP 403.17 - 禁止访问:客户证书已经到期或者尚未生效
  404 — 一个 404 错误表明可连接服务器,但服务器无法取得所请求的网页,请求资源不存在。eg:输入了错误的 URL
  405 — 用户在 Request-Line 字段定义的方法不允许
  406 - 根据用户发送的 Accept 头,请求资源不可访问
  407 — 类似 401,用户必须首先在代理服务器上得到授权
  408 — 客户端没有在用户指定的时间内完成请求
  409 — 对当前资源状态,请求不能完成
  410 — 服务器上不再有此资源且无进一步的参考地址
  411 — 服务器拒绝用户定义的 Content-Length 属性请求
  412 — 一个或多个请求头字段在当前请求中错误
  413 — 请求的资源大于服务器允许的大小
  414 — 请求的资源 URL 长于服务器允许的长度
  415 — 请求资源不支持请求项目格式
  416 — 请求中包含 Range 请求头字段,在当前请求资源范围内没有 Range 指示值,请求也不包含 If-Range 请求头字段
  417 — 服务器不满足请求 Expect 头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求
5** (服务端错误类):服务器不能正确执行一个正确的请求
  HTTP 500 - 服务器遇到错误,无法完成请求
    HTTP 500.100 - 内部服务器错误 - ASP 错误
    HTTP 500-11 服务器关闭
    HTTP 500-12 应用程序重新启动
    HTTP 500-13 - 服务器太忙
    HTTP 500-14 - 应用程序无效
    HTTP 500-15 - 不允许请求 global.asa
    Error 501 - 未实现
  HTTP 502 - 网关错误
  HTTP 503 - 由于超载或停机维护,服务器目前无法使用,一段时间后可能恢复正常一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?(流程说的越详细越好)
注:这题胜在区分度高,知识点覆盖广,再不懂的人,也能答出几句,而高手可以根据自己擅长的领域自由发挥,从 URL 规范、HTTP 协议、DNS、CDN、数据库查询到浏览器流式解析、CSS 规则构建、layout、paint、onload/domready、JS 执行、JS API 绑定等等
详细版:
- 浏览器会开启一个线程来处理这个请求,对 URL 分析判断如果是 http 协议就按照 Web 方式来处理
- 调用浏览器内核中的对应方法,比如 WebView 中的 loadUrl 方法
- 通过 DNS 解析获取网址的 IP 地址,设置 UA 等信息发出第二个 GET 请求
- 进行 HTTP 协议会话,客户端发送报头(请求报头)
- 进入到 web 服务器上的 Web Server,如 Apache、Tomcat、Node.JS 等服务器
- 进入部署好的后端应用,如 PHP、Java、JavaScript、Python 等,找到对应的请求处理
- 处理结束回馈报头,此处如果浏览器访问过,缓存上有对应资源,会与服务器最后修改时间对比,一致则返回 304
- 浏览器开始下载 HTML 文档(响应报头,状态码 200),同时使用缓存
- 文档树建立,根据标记请求所需指定 MIME 类型的文件(比如 css、js),同时设置了 cookie
- 页面开始渲染 DOM,JS 根据 DOM API 操作 DOM,执行事件绑定等,页面显示完成
简洁版:
- 浏览器根据请求的 URL 交给 DNS 域名解析,找到真实 IP,向服务器发起请求
- 服务器交给后台处理完成后返回数据,浏览器接收文件(HTML、JS、CSS、图象等)
- 浏览器对加载到的资源(HTML、JS、CSS 等)进行语法解析,建立相应的内部数据结构(如 HTML 的 DOM)