面试题学习笔记 | 计算机网络 HTTP 请求
在实际开发中,为了实现系统中各组件和进程之间的高效协作,我们需要掌握各种网络知识。在 Web 开发中,HTTP 请求是我们最常接触的部分之一,它不仅是 API 调用的基础,同时也是面试中常被考察的知识点😟
HTTP 请求包含哪些内容?
要构造一个完整的请求,我们需要描述清楚请求对象、请求动作以及附带的相关信息,因此 HTTP 请求主要包含以下几个部分:
请求行(request line):包含请求方法(比如 GET、POST)、请求的资源路径、HTTP 协议版本
请求头(request headers):包含各种键值对,用来传递客户端环境、请求内容、认证信息等
空行(blank line):用于分隔请求头和请求体
请求体(request body):包含需要发送到服务器的数据
针对不同的需求,我们可以使用不同的参数拼接出不同的 HTTP 请求,其中有些重要的内容是我们需要重点关注的,比如请求方法、请求头部和请求体类型
请求方法
如果了解过 RESTful 风格,我们就可以知道常见的请求方式有:
GET:从服务器获取资源
POST:在服务器新建一个资源
PUT:在服务器更新完整资源
PATCH:在服务器更新资源的个别属性
DELETE:从服务器删除资源
此外,在 Web 项目开发中经常会接触 OPTIONS 请求,在跨域请求之前,浏览器会先向服务器发送一个 OPTIONS 请求,用于测试服务器支持哪些请求方法
请求头部
请求头部包含了服务器需要的各种信息,常见的请求头部有以下内容:
Host:指定请求的主机名和端口,在 HTTP/1.1 里必须包含
User-Agent:标识客户端信息
Accept:指定客户端可以接受的媒体类型
Authorization:用于身份验证,包含凭证信息
一些特殊的请求头也很重要,比如:
Cache-Control:用于有效管理缓存,减少不必要的请求
Content-Encoding:指定压缩方式,减少数据传输量
请求体
请求体可以包含多种类型,用来向服务器上传数据,比如:
application/x-www-form-urlencoded:键值对形式的表单数据
multipart/form-data:处理复杂表单,包括文件上传,比如 Java 后端可以用
MultipartFile
类来处理用户上传的文件自定义数据格式:根据 API 的需求,通过不同的
Content-Type
标识数据格式,如 XML、JSON,甚至二进制数据
HTTP 中 GET 和 POST 的区别是什么?
在业务开发中,我们最常使用的请求类型是 GET 和 POST,甚至有些公司的开发规范中会出现只使用 POST 的情况。理解它们的区别有助于我们在实际场景中更合理地选择请求方式
从 HTTP 的定义来看:
GET:用于获取资源,通常用来请求数据而不对服务器状态进行改变
POST:用于提交数据到服务器,通常会改变服务器状态或者产生副作用(比如创建或者更新资源)
由于这个区别,二者的幂等性不同:
GET 请求通常是幂等的,因为多次查询不会改变服务器状态
POST 请求通常是非幂等的,多次请求可能导致重复创建资源或重复操作
这也影响了二者的缓存机制:
GET 请求可缓存,浏览器和 CDN 可以缓存 GET 请求的结果,减少服务器负载
POST 请求默认不缓存,大部分浏览器和缓存服务器不会缓存 POST 请求,以确保数据的正确性
在数据传输上,GET 和 POST 也有显著区别:
GET 请求的参数通过 URL 传递,暴露在 URL 中,并且长度有限
POST 请求的参数放在请求体里,不会直接暴露,并且理论上没有长度限制,更适合传递大量数据(但 POST 也可以带有 URL 参数)
因为这些差异,二者在网络层的表现也不同:
GET 请求通常复用已有的 TCP 连接,因为它是无状态的、快速的请求
POST 请求数据量较大,可能涉及多个数据包的传输,在某些情况下会创建新的 TCP 连接
常见的 HTTP 状态码有哪些?
当服务器接收到请求并处理后,会返回一个响应报文,包含响应头和响应体。响应头中最重要的部分是状态行,包含 HTTP 协议版本、状态码和原因短语
HTTP 状态码是三位数,并且按照类别划分为五类:
1xx:信息响应
100 Continue
:服务器已接收部分请求,客户端应继续发送101 Switching Protocols
:服务器同意切换协议,如从 HTTP 切换到 WebSocket
2xx:成功
200 OK
:请求成功201 Created
:请求成功并且创建了新的资源,常用于 POST 请求204 No Content
:请求成功,但服务器不返回内容,常用于 DELETE 操作
3xx:重定向
301 Moved Permanently
:资源已永久移动到新 URL302 Found
:资源临时移动到新 URL304 Not Modified
:资源未修改,客户端可使用缓存版本
4xx:客户端错误
400 Bad Request
:请求无效或语法错误401 Unauthorized
:请求需要身份验证403 Forbidden
:服务器理解请求但拒绝执行404 Not Found
:请求的资源在服务器上未找到(最破圈的状态码之一 🤗)429 Too Many Requests
:客户端请求过多,可能被限流
5xx:服务器错误
500 Internal Server Error
:服务器内部错误502 Bad Gateway
:服务器作为网关,接收到无效响应503 Service Unavailable
:服务器暂时无法处理请求,可能因过载或维护
虽然 HTTP 状态码可以帮助我们判断响应的情况,但在复杂业务场景下,状态码往往不足以完全表达业务逻辑。因此,很多系统会在响应体中封装自定义状态码,以更细粒度地描述业务状态,通常这些自定义状态码的设计会参考 HTTP 状态码的规则
总结
在 Web 开发中,HTTP 是最基础的协议之一,理解 HTTP 请求的结构、方法、状态码等内容,不仅能帮助我们更高效地开发 API,也能够帮助我们在开发和调试时少走弯路,提高开发效率