HTTP、HTTPS 和 API
Web 通信是如何工作的:HTTP 组织请求,HTTPS 为其提供安全保护,而 API 定义软件系统之间如何交互。
HTTP 解决什么问题
TCP 为我们提供了可靠的连接,但 HTTP 定义了结构化的语言,使客户端和服务器能够相互理解。
- 定义客户端如何正式请求特定资源(文件、数据、API)。
- 标准化元数据和内容如何被打包与传输。
- 建立客户端与服务器之间清晰的请求–响应模型。
详情
一旦 TCP 建立了可靠连接,两台机器就可以安全地交换字节。然而,原始字节本身并没有固有含义。如果没有共享协议,服务器就无法知道这些字节表示的是文件请求、表单提交,还是其他内容。
HTTP(Hypertext Transfer Protocol)定义了一种结构化的通信格式。客户端发送一个 request(例如 GET /index.html),服务器返回一个包含状态信息和数据的 response。
HTTP 标准化了资源如何被请求、元数据如何被包含,以及响应如何被格式化。这使得 Web 通信在浏览器、服务器和平台之间都具有可预测性和互操作性。
简而言之,TCP 负责传输,HTTP 负责理解。
HTTP 请求的结构
HTTP 请求是一种结构化消息,由方法、目标路径、请求头和可选的请求体组成。
GET /users/123 HTTP/1.1 Host: api.example.com Authorization: Bearer xyz User-Agent: Browser
POST /users HTTP/1.1 Host: api.example.com Content-Type: application/json Authorization: Bearer xyz { "name": "Alice" }
- Method 定义预期的操作(GET、POST、PUT、DELETE)。
- Path 标识正在请求的具体资源。
- Headers and Body 传递元数据和可选的数据负载。
详情
HTTP 请求以 request line 开始。它包含 method 和 path。例如:
GET /users/123 HTTP/1.1
这告诉服务器正在请求什么操作,以及目标资源是什么。
method 表达意图。
GET获取数据。POST提交新数据。PUT更新现有数据。DELETE删除数据。
headers 提供额外上下文,例如内容类型(Content-Type)、身份验证凭据(Authorization),或关于客户端的信息(User-Agent)。
最后,有些请求会包含 body。例如,POST 请求可能会包含提交给服务器的 JSON 数据。
这些组件组合在一起,形成一种可预测的结构,服务器可以正确解析并理解。
HTTP 响应结构
HTTP 响应会返回状态码、headers 和 body —— 告诉客户端发生了什么,并传递请求的数据。
HTTP/1.1 200 OK Content-Type: application/json Content-Length: 27 Cache-Control: no-cache { "id": 123, "name": "Alice" }
HTTP/1.1 404 Not Found Content-Type: application/json Content-Length: 29 Cache-Control: no-cache { "error": "未找到用户" }
- Status code 表示结果(200、404、500)。
- Headers 描述响应的元数据。
- Body 包含返回给客户端的实际内容。
详情
HTTP 响应以一个 status line 开始,例如:
HTTP/1.1 200 OK
status code 用于传达请求的结果。
200表示成功。404表示资源未找到。500表示服务器端错误。
接下来是 headers,它们提供关于响应的元数据。这些可能包括 Content-Type(例如 JSON 或 HTML)、Content-Length、缓存规则或安全策略。
最后,body 包含请求的实际数据——例如 HTML 页面、JSON 对象或文件。
响应结构确保客户端既能理解发生了什么,也能知道返回了什么数据。
为什么 HTTP 是无状态的
HTTP 将每个请求都视为独立的——服务器不会自动记住之前的交互。
- 每个请求都是独立处理的。
- 默认情况下,服务器不会保留之前请求的记忆。
- 状态必须显式管理(例如:cookies、tokens、sessions)。
详情
HTTP 被设计为一种 无状态协议。这意味着当客户端发送请求时,服务器会在不假设任何先前上下文的情况下处理它。
例如,如果你打开一个网页,然后点击一个按钮,第二个请求不会自动包含第一个请求的记忆。每个请求都必须包含服务器处理它所需的全部信息。
无状态性简化了扩展。由于服务器不依赖已存储的连接状态,请求可以通过负载均衡器分发到多台机器上。
当应用需要连续性时——例如登录会话或购物车——它们会使用 cookies、session identifiers 或 authentication tokens 显式地实现状态。
HTTPS 带来了什么
HTTPS 通过在 TCP 之上叠加 TLS 来保护 HTTP,从而保护传输中的数据。
- HTTPS 会加密客户端和服务器之间的所有 HTTP 流量。
- HTTPS 使用数字证书验证服务器的身份。
- HTTPS 通过加密完整性检查防止篡改。
详情
HTTPS 代表 HTTP over TLS (Transport Layer Security)。它不是以明文发送 HTTP 消息,而是在传输前先对数据进行加密。
使用 HTTPS 时,HTTP 请求和响应中的所有内容——包括 headers 和 body——都会被加密。这可以防止网络上的攻击者读取密码或 token 等敏感信息。
HTTPS 还要求服务器提供有效的 digital certificate。浏览器会将该证书与受信任的 Certificate Authorities 进行验证,以确认服务器的真实性。
此外,TLS 会应用加密完整性检查,确保数据在传输过程中没有被修改。
简而言之,HTTPS 保护 Web 通信的机密性、真实性和完整性。
TLS 握手
在加密通信开始之前,TLS 会先进行一次握手,以协商算法、验证身份并建立共享加密密钥。
客户端
服务器
客户端:这是我支持的加密方法。
- Client Hello 提议支持的加密算法和随机数据。
- Server Hello + Certificate 选择参数并证明身份。
- Key Agreement 建立用于加密的共享密钥。
详情
当客户端连接到 HTTPS 服务器时,TLS 会先进行一次 handshake,然后才会发送任何 HTTP 数据。
这个过程从 Client Hello 开始。客户端会提议支持的加密算法(cipher suites),并发送随机数据,这些数据会在后续的密钥生成中使用。
服务器会返回 Server Hello,选择加密参数。它还会发送自己的 digital certificate,其中包含其公钥,并由受信任的 Certificate Authority 签名。
客户端会验证证书,并执行 key agreement 过程(例如 Diffie-Hellman)。双方会在不直接传输的情况下,各自独立推导出相同的共享密钥。
一旦握手完成,就会建立对称加密密钥,之后所有 HTTP 流量都会被加密。
证书与信任
数字证书允许客户端验证它们正在与合法服务器通信,而不是与攻击者通信。
- 证书颁发机构(CA)会对服务器身份进行签名和验证。
- 证书包含服务器的公钥。
- 浏览器在建立信任之前会验证域名所有权。
详情
数字证书由一个称为**证书颁发机构(CA)**的受信任第三方签发。CA 会验证申请证书的组织是否确实控制该域名。
证书包含服务器的公钥,以及关于该域名的标识信息。这个公钥会在 TLS 握手期间用于建立加密通信。
当你的浏览器连接到网站时,它会检查该证书是否由它已经信任的 CA 签名。浏览器内置了一份受信任证书颁发机构列表。
如果证书有效、未过期,并且与请求的域名匹配,浏览器就会继续建立安全连接。否则,它会显示警告。
因此,HTTPS 中的信任基于一条链:
你信任 CA → CA 信任服务器 → 你信任服务器。
什么是 API?
API 定义了一个结构化的契约,使软件系统能够以可预测的方式进行通信。
- 定义系统向外部客户端暴露的一组操作。
- 为请求结构、身份验证和响应格式建立严格的契约。
- 创建一个稳定的边界,将内部实现与外部使用者解耦。
详情
API(Application Programming Interface) 是一种关于软件组件如何交互的正式规范。它定义了可用的操作,以及这些操作如何被访问。
在 Web 系统中,API 通常使用 HTTP。客户端通过定义好的方法(如 GET 或 POST)向特定的 endpoint(例如 /users/123)发送请求。
API 还定义了预期的 request format(例如,请求体中的 JSON)以及服务器返回的 response format 结构。
如果没有 API,系统就只能依赖未文档化的约定或高度耦合的集成。API 创建了清晰的边界,使独立开发、可扩展性以及服务之间的互操作性成为可能。
REST APIs
REST 是一种架构风格,它使用 HTTP 方法和基于资源的 URL 来创建可预测、可扩展的 Web API。
GET /users/42
{
"id": 42,
"name": "Alex",
"role": "admin"
}- 围绕资源及其表示来组织 API,而不是采用 RPC 风格的动作。
- 使用标准 HTTP 语义来表达意图(GET = 安全读取,POST = 创建,等等)。
- 强制无状态交互,以支持水平扩展。
详情
REST(Representational State Transfer,表述性状态转移)围绕资源来组织 API,而不是围绕动作。资源通过 URL 来表示,例如 /users 或 /orders/123。
REST 不会在 URL 中嵌入动词,而是使用 HTTP methods 来定义操作:
GET获取数据。POST创建新数据。PUT更新现有数据。DELETE删除数据。
REST APIs 是无状态的,这意味着每个请求都包含所有必要信息。服务器在处理当前请求时不会依赖之前的请求。
大多数 REST APIs 使用 JSON format 交换数据,它轻量、易读,并且容易被机器解析。
这种结构使 REST APIs 保持一致、可扩展,并且在分布式系统中更容易理解。
常见的 HTTP/HTTPS/API 故障场景
并不是所有 Web 故障都发生在同一层——错误可能来自应用逻辑、传输层或 TLS 安全层。
- 404 未找到 → 应用层路由未能找到资源。
- 500 内部服务器错误 → 服务器遇到内部处理错误。
- 连接被拒绝 或 SSL 证书错误 → 传输层或 TLS 层故障。
详情
404 未找到错误表示服务器可达,但请求的路由或资源不存在。这通常是应用层路由问题。
500 内部服务器错误表示请求已经到达服务器,但在执行过程中发生了某些失败——例如崩溃、未处理的异常或数据库故障。
连接被拒绝错误发生在更早的协议栈阶段。客户端无法建立 TCP 连接,通常是因为服务器已关闭,或者目标端口上没有进程在监听。
SSL 证书错误会在 TLS 握手期间发生,如果证书无效、已过期,或者与域名不匹配。浏览器会阻止连接以保护用户。
当 HTTPS 页面尝试加载 HTTP 资源时,会出现混合内容警告。这会破坏 HTTPS 的安全保障,并被现代浏览器标记出来。
理解故障发生的位置——应用层、传输层或 TLS 层——对于有效调试至关重要。
问题部分
1 / 5