文章

面试题学习笔记 | 计算机网络 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:资源已永久移动到新 URL

    • 302 Found:资源临时移动到新 URL

    • 304 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,也能够帮助我们在开发和调试时少走弯路,提高开发效率

License:  CC BY 4.0