ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[天下无难试之HTTP协议面试刁难大全(上)](https://juejin.im/post/5ab308e9f265da238e0da39b) [图解HTTP 京东](http://item.jd.com/11449491.html) [http mdn](https://developer.mozilla.org/zh-CN/docs/Web/HTTP) # HTTP协议 ## 请求报文的构成 请求报文是由请求方法、请求 URI、协议版本、可选的请求首部字段和内容实体构成的。 ![](https://img.kancloud.cn/5b/37/5b37b3747a172d96e276a599a0e4e67d_827x390.png) ## 响应报文的构成 响应报文基本上由协议版本、状态码(表示请求成功或失败的数字代码)、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成 ![](https://img.kancloud.cn/27/b2/27b204083a5e25382c4ced562e6da62e_696x384.png) ## HTTP 是不保存状态的协议 HTTP协议是无状态协议,HTTP 协议自身不对请求和响应之间的通信状态进行保存.这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设计成如此简单的。 HTTP/1.1 虽然是无状态协议,但为了实现期望的保持状态功能,于是引入了 Cookie 技术。有了 Cookie 再用 HTTP 协议通信,就可以管理状态了。 ## 请求 URI 定位资源 HTTP 协议使用 URI 定位互联网上的资源。正是因为 URI 的特定功能,在互联网上任意位置的资源都能访问到 ## 告知服务器意图的 HTTP 方法 **方法名区分大小写,注意要用大写字母。 ** GET :获取资源 GET 方法用来请求访问已被 URI 识别的资源,restful 中可用来查询 POST:传输实体主体 虽然用 GET 方法也可以传输实体的主体,但一般不用 GET 方法进行传输,而是用 POST 方法,restful 中可用来新增 PUT:传输文件 PUT 方法用来传输文件。就像 FTP 协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置,鉴于 HTTP/1.1 的 PUT 方法自身不带验证机制,任何人都可以上传文件 , 存在安全性问题因此一般的不使用该方法。restful 中可用来更新一个资源。或新增一个含 id 资源(如果 id 不存在) DELETE:删除文件 删除一个资源 HEAD:获得报文首部 OPTIONS:询问支持的方法 TRACE:追踪路径 ## 持久连接节省通信量 HTTP 协议的初始版本中,每进行一次 HTTP 通信就要断开一次 TCP连接。 ![](/assets/%23N756KC6KD6N9F0.png) 容量很小的文本传输,这样做也没有多大问题,但使用浏览器浏览一个包含多张图片的 HTML页面时,在发送请求访问 HTML页面资源的同时,也会请求该 HTML页面里包含的其他资源。因此,每次的请求都会造成无谓的 TCP 连接建立和断开,增加通信量的开销。 ## 使用 Cookie 的状态管理 Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存 Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。 服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。 # http状态码 状态码告知从服务器端返回的请求结果 ![](https://img.kancloud.cn/01/ed/01edbc5e862412e6c9e3f65e32a118e6_800x427.png) ## 状态码的类别 ||类别|原因| |---|---|---| |1XX|Informational(信息性状态码)|接收的请求正在处理| |2XX|Success(成功状态码)|请求正常处理完毕| |3XX|Redirection(重定向状态码)|需要进行附加操作以完成请求| |4XX|Client Error(客户端错误状态码)|服务器无法处理请求| |5XX|Server Error(服务器错误状态码)|服务器处理请求出错| ## 常用状态码 ### 2XX 成功 2XX 的响应结果表明请求被正常处理了。 #### 200 OK 表示从客户端发来的请求在服务器端被正常处理了。 #### 204 No Content 该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体 #### 206 Partial Content 该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求。响应报文中包含由 Content-Range 指定范围的实体内容。 ### 3XX 重定向 3XX 响应结果表明浏览器需要执行某些特殊的处理以正确处理请求。 #### 301 Moved Permanently 永久性重定向。该状态码表示请求的资源已被分配了新的 URI,以后应使用资源现在所指的 URI #### 302 Found 临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。 #### 303 See Other 该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET方法定向获取请求的资源。 #### 304 Not Modified 未改动 无需再次传输请求的内容,也就是说可以使用缓存的内容 ### 4XX 客户端错误 4XX 的响应结果表明客户端是发生错误的原因所在。 #### 400 Bad Request 该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求 #### 401 Unauthorized 该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。另外若之前已进行过 1 次请求,则表示用户认证失败。 #### 403 Forbidden 该状态码表明对请求资源的访问被服务器拒绝了 #### 404 Not Found 该状态码表明服务器上无法找到请求的资源 ### 5XX 服务器错误 5XX 的响应结果表明服务器本身发生错误。 #### 500 Internal Server Error 该状态码表明服务器端在执行请求时发生了错误。也有可能是 Web应用存在的 bug 或某些临时的故障。 #### 503 Service Unavailable 该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。 #### 504 Gateway Timeout 超时 是一种HTTP协议的服务器端错误状态代码,表示扮演网关或者代理的服务器无法在规定的时间内获得想要的响应。