一、API测试 (重点)
HTTP(超文本传输协议)详解
为什么说HTTP是超文本传输协议?
这个名称精确地概括了HTTP的核心本质,我们可以拆解来看:
- 超文本
- “文本” 指的是文字、字符等基本信息。
- “超”意味着“超越”或“链接”。超文本是一种包含超链接的文本,允许用户从一个文档跳转到另一个相关文档。
- 最典型的超文本系统就是万维网。我们浏览网页时,通过点击链接从一个页面跳转到另一个页面,这正是“超文本”的体现。
- 如今,HTTP传输的早已不限于文本,还包括图片、视频、音频、CSS、JavaScript等所有Web资源,但它的设计初衷和核心思想源于“超文本”。
- 传输
- 这指明了HTTP协议的主要作用——在两点之间搬运数据。
- 通常,这两点是客户端和服务器端。客户端(Web浏览器)发出请求,服务器端(后台应用服务器)返回响应。
- 协议
- 协议是一套预先定义好的规则和约定。HTTP规定了客户端和服务器之间通信的语法、格式和顺序。双方都必须遵守这套规则,才能正确理解对方的意图,完成数据的交换。
HTTP协议简介
HTTP 是一种用于分布式、协作式和超媒体信息系统的应用层协议。它是万维网(WWW)数据通信的基础。
- 客户端-服务器模型:HTTP 遵循经典的客户端-服务器模型。浏览器(客户端)向服务器发送请求,服务器返回一个响应。
- 无状态协议:默认情况下,每个 HTTP 请求都是独立的,服务器不会保留之前请求的任何信息。为了实现状态(如用户登录),需要使用 Cookie、Session 等技术。
- 基于 TCP/IP:HTTP 依赖于 TCP(或 TLS 加密的 TCP,即 HTTPS)来保证数据的可靠传输。
一个完整的 HTTP 事务包含四个步骤:
- 建立 TCP 连接。
- 客户端发送 HTTP 请求。
- 服务器处理请求并返回 HTTP 响应。
- 关闭 TCP 连接(在 HTTP/1.0 或
Connection: close时;HTTP/1.1 默认使用持久连接)。
下面我们深入到请求和响应的各个部分。
- HTTP请求方法
HTTP 方法指明了客户端希望服务器对资源执行的操作。它们也被称为“动词”。
| 方法 | 英文含义 | 描述 | 特点 | 幂等性 | 安全性 | 典型应用场景 |
|---|---|---|---|---|---|---|
| GET | Retrieve | 请求指定的资源。只应用于获取数据,不应产生“副作用”(如修改数据)。 | 请求参数以查询字符串的形式附加在 URL 之后(如 ?key=value),有长度限制,且会在浏览器历史记录和日志中明文显示,不安全。 |
✅ | ✅ | 点击链接、在浏览器地址栏输入网址、搜索。 |
| POST | Create | 提交指定的资源。只应用于提交数据,会导致服务器状态变化(如创建新资源、提交表单)。 | 请求参数放在 请求体(Body) 中,没有长度限制,相对 GET 更安全(不会在 URL 中显示)。 | ❌ | ❌ | 用户登录、发表评论、提交订单。 |
| PUT | Update/Replace | 用请求体中的内容 完整替换 目标资源。如果资源不存在,则创建它。 | 常用于更新整个资源。 | ✅ | ❌ | 更新用户个人资料(全部字段)。 |
| PATCH | Update/Modify | 用于对资源进行部分修改。与 PUT 替换整个资源不同,PATCH 只发送需要更新的字段。 | 在 RESTful API 中广泛应用。 | ❓(取决于实现方式) | ❌ | 只修改用户的手机号。 |
| DELETE | Delete | 请求服务器,删除 指定资源。 | --- | ✅ | ❌ | 删除一篇文章、注销账号。 |
| HEAD | Head | 与 GET 类似,但服务器只返回响应头,不返回响应体。 | 用于获取资源的元信息,如检查资源是否存在、查看文件大小或最后修改时间,而无需下载整个内容。 | ✅ | ✅ | 检查链接是否有效、判断资源是否被修改过。 |
| OPTIONS | Options | 用于获取目标资源所支持的通信选项(如支持的 HTTP 方法)。 | CORS(跨域资源共享)预检请求。 | ✅ | ✅ | A请求B中的某个属性 |
- 幂等性: 相同的请求执行一次与执行多次,对资源的状态产生的影响是相同的。GET, PUT, DELETE都是幂等的,POST不是。
- 安全性: 该方法是否仅用于获取数据,而不修改服务器上的资源。GET和HEAD是安全的。
最常用的是GET和POST。
- HTTP状态码
状态码是一个三位数字,用于表示服务器对请求的处理结果。它分为5类:
| 概述 | 类别 | 含义 | 常见状态码 |
|---|---|---|---|
| 表示请求已被接收,需要继续处理。 | 1xx | 信息性 | 100 Continue(继续) 101 Switching Protocols (切换协议) |
| 表示请求已被服务器成功接收、理解并接受。 | 2xx | 成功 | 200 OK(请求成功) 201 Created(已创建,常用于POST/PUT成功) 204 No Content(成功,但无内容返回) |
| 表示需要客户端采取进一步的操作才能完成请求。 | 3xx | 重定向 | 301 Moved Permanently(永久重定向) 302 Found(临时重定向) 304 Not Modified(资源未修改,使用缓存) |
| 表示客户端似乎有错误,服务器无法处理请求。 | 4xx | 客户端错误 | 400 Bad Request(请求语法错误) 401 Unauthorized(未认证) 403 Forbidden(服务器理解请求但拒绝执行) 404 Not Found(资源未找到) 405 Method Not Allowed(方法不被允许) |
| 表示服务器在处理请求的过程中发生了错误。 | 5xx | 服务器错误 | 500 Internal Server Error(服务器内部错误) 502 Bad Gateway(网关错误) 503 Service Unavailable(服务不可用) 504 Gateway Timeout(网关超时) |
- HTTP头部
HTTP 头部允许客户端和服务器通过请求和响应传递附加信息。它们是键值对,不区分大小写。
-
通用头部
可用于请求和响应消息。Cache-Control:指定缓存机制。Connection:控制本次事务完成后是否关闭网络连接。Date:消息创建的日期和时间。
-
请求头部
提供关于请求、客户端或客户端的首选格式的更多信息。Host:请求的目标主机和端口号(HTTP/1.1 必须)。User-Agent:包含发起请求的客户端应用程序的信息。Accept:告知服务器客户端能够处理的内容类型(如Accept: text/html, application/json)。Accept-Encoding:客户端支持的压缩格式(如gzip, deflate)。Authorization:包含用于服务器验证客户端身份的凭证(如Bearer <token>)。Cookie:将之前服务器通过Set-Cookie发送的 Cookie 回传给服务器。Content-Type:请求体的媒体类型(如application/json)。Content-Length:请求体的字节长度。
-
响应头部
提供关于响应的额外信息。Server:包含处理请求的服务器软件信息。Set-Cookie:服务器向客户端发送 Cookie。Content-Type:响应体的媒体类型(如text/html; charset=utf-8)。Content-Length:响应体的字节长度。Content-Encoding:响应体使用的编码格式(如gzip)。Location:在重定向时使用,指定要重定向到的 URL。
- HTTP 消息体
消息体是 HTTP 传输的核心数据部分,在请求和响应中都是可选的。
-
请求体
- 何时存在:通常在 POST、PUT、PATCH 等需要向服务器发送数据的请求中使用。
- 格式:由
Content-Type头部指定。application/x-www-form-urlencoded:默认的表单提交格式,如key1=value1&key2=value2。multipart/form-data:用于上传文件。application/json:传输 JSON 格式的数据(RESTful API 常用)。application/xml:传输 XML 格式的数据。
-
响应体
- 何时存在:服务器返回给客户端的实际内容,如 HTML 页面、JSON 数据、图片、CSS、JavaScript 等。
- 格式:由响应头中的
Content-Type指定。text/html:HTML 文档。application/json:JSON 数据。image/png:PNG 图片。application/javascript: JavaScript文件。
- HTTP请求/响应示例
-
请求:
POST /api/login HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0... Content-Type: application/json Content-Length: 42{"username": "alice", "password": "secret"}- 第一行(请求行):
POST(方法)/api/login(路径)HTTP/1.1(协议版本)。 - 第2-5行(请求头): 包含了请求的元信息。
- 空行: 分隔头部和消息体。
- 最后一行(消息体): 实际发送的JSON数据。
- 第一行(请求行):
-
响应:
HTTP/1.1 200 OK Content-Type: application/json Set-Cookie: sessionId=abc123; Path=/ Content-Length: 29{"status": "success", "user": "Alice"}- 第一行(状态行):
HTTP/1.1(协议版本)200(状态码)OK(状态消息)。 - 第2-4行(响应头): 包含了响应的元信息,包括设置一个Cookie。
- 空行: 分隔头部和消息体。
- 最后一行(消息体): 服务器返回的JSON数据。
- 第一行(状态行):
- 补充:HTTP的发展
- HTTP/1.0: 每个请求/响应都需要建立一个新的TCP连接,效率低下。
- HTTP/1.1(目前最主流):
- 引入了持久连接,一个TCP连接可以处理多个请求。
- 引入了管道化,但存在队头阻塞问题。
- HTTP/2:
- 二进制协议,性能更高。
- 多路复用,解决了队头阻塞。
- 服务器推送。
- HTTP/3:
- 基于QUIC协议(运行在UDP上),进一步减少连接建立延迟。
- 解决了TCP层面的队头阻塞问题。
总结
| 组成部分 | 作用 | 关键示例 |
|---|---|---|
| 方法 | 定义操作类型 | GET(取),POST(增),PUT(改),DELETE(删) |
| 状态码 | 表示请求结果 | 200(成功),404(未找到),500(服务器错误) |
| 头部 | 传递元信息 | Content-Type(数据类型),Authorization(认证) |
| 消息体 | 传输实际数据 | HTML代码,JSON字符串,表单数据 |
理解这四个核心部分,是掌握 Web 开发、API 设计和网络调试的基础。它们共同协作,完成了我们在互联网上的每一次点击和浏览。