# 前后置操作

前置和后置操作是 Apifox 的关键功能。在发送请求时，你可以通过前置操作动态控制请求，或通过后置操作处理接收到的响应。

在 Apifox 中，你可以通过可视化的拖拽操作轻松完成大部分前置和后置操作，简便易用。

## 开始使用

在 Apifox 中使用前置和后置操作的步骤如下：

<Steps>
  <Step>
    打开任意接口并切换到运行标签页 *（文档模式）* 或请求标签页 *（调试模式）*。
  </Step>
  <Step>
    切换到前置操作或后置操作部分，鼠标悬停在 “添加操作” 上，选择想要添加的操作。
      
<Background>

![image.png](https://api.apifox.com/api/v1/projects/5097254/resources/480109/image-preview)
</Background>

  </Step>
  <Step>
填写添加操作所需的字段。
  </Step>
  <Step>
    点击 “发送”，请求将带着配置好的前置/后置操作执行。
  </Step>
  <Step>
    在文档模式下，点击 “保存为用例” 来保存请求。在调试模式下，点击 “保存/保存为用例” 来保存请求。
  </Step>
</Steps>



## 前置/后置操作的作用

前置/后置操作可以实现以下各种功能。


### 前置操作

- **设置请求参数和请求体的值**：处理将发送给接口的输入数据。
  
- **设置请求头**：为 API 请求指定必要的头部信息，如 Content-Type、Accept、Authorization 等。
  
- **为请求添加认证**：包括添加访问受保护 API 所需的认证令牌、API 密钥或其他凭据。

- **从数据库获取值作为请求参数**：从数据库中提取相关数据，用动态或预定义的值填充 API 请求。
  
- **加密请求**：通过加密请求参数来保护敏感信息，确保数据传输的安全性。

### 后置操作

- **编写断言**：校验 API 返回的响应是否符合预期结果，可能包括检查状态码、响应消息、特定数据值等。

- **从响应中提取变量**：提取响应中的数据并将其存储为变量，以便在后续请求中使用，有助于维护 API 测试流程的状态和连续性。

- **将数据写入数据库**：将 API 测试过程中生成的数据存储或更新到数据库中，适用于需要持久化数据以供后续分析或参考的场景。

- **可视化响应数据**：通过生成报告、图表或其他可视化表示方式，帮助分析和理解 API 响应数据，从而洞察系统的行为和性能。


:::tip[注意]
部分前后置操作在访问数据库、调用外部程序或动态加载 npm 包时，可能触发安全授权确认。你可以前往「[安全性](https://docs.apifox.com/8886331m0.md)」设置中提前配置授权范围。
:::


## 前置/后置操作列表


Apifox 支持以下前置/后置操作：

- **[断言](https://docs.apifox.com/assertions.md)**：仅在后置操作中可用。允许定义校验规则，检查响应数据是否符合预期值或条件，支持多种断言类型，如状态码、响应体、请求头等。

- **[提取变量](https://docs.apifox.com/extract-variables.md)**：仅在后置操作中可用。可以从响应 *（JSON、XML 或纯文本）* 中提取值并存储为变量。支持使用 JSONPath 和 XPath 表达式来定位响应中的特定部分，这些变量可在后续请求或其他操作中使用。

- **[数据库操作](https://docs.apifox.com/database.md)**：在前置和后置操作中均可使用。允许连接数据库并执行 SQL 查询，查询结果可存储为变量以供进一步处理。支持多种数据库类型，包括关系型和非关系型数据库。

- **[自定义脚本](https://docs.apifox.com/scripts.md)**：在前置和后置操作中均可使用。提供一个脚本环境，允许编写 JavaScript 代码。脚本可以访问接口请求、响应数据以及环境变量，适用于实现复杂逻辑，尤其是那些无法通过可视化操作轻松完成的任务。


- **[公共脚本](https://docs.apifox.com/common-scripts.md)**：可用于前置和后置操作。允许创建可复用的脚本片段，供多个操作或场景共享。适用于封装常用逻辑或实用函数，提升脚本的复用性和维护性。

- **[等待时间](https://docs.apifox.com/wait-time.md)**：可用于前置和后置操作。可以在发送请求前后引入延迟或等待期，适用于模拟真实场景或处理异步响应，确保系统按预期的时间顺序执行操作。


## 前置/后置操作的执行顺序

Apifox 中的前置和后置操作可以在多个层级进行配置：

- **运行页/接口用例级别**：默认级别，设置的操作仅影响当前运行页或接口用例。
- **接口级别**：设置的操作会应用于该接口的所有用例（请求）。
- **目录级别**：设置的操作会影响该目录下的所有接口。

一个请求中的后置操作可能如下图所示：


<Background>

![image.png](https://api.apifox.com/api/v1/projects/5097254/resources/480120/image-preview)
</Background>

在上面的截图中，前两个操作被标记为 “**继承自父级**”。右侧的标签显示它们位于根目录和当前接口级别。这些操作在当前运行页中只能选择是否启用，无法直接编辑。如需编辑，点击操作项可导航到相应的层级进行修改。

“继承自父级” 的操作默认会折叠，你可以通过点击前面的复选框来选择是否执行它们。

最后两个操作——一个提取变量，一个数据库操作，是在当前运行页中新增的，可以在此页进行编辑。

### 变量替换

你可能注意到，在所有前置操作的末尾，有一个名为 “**变量替换 & 继承自父级**” 的步骤。

在 Apifox 中，**“变量替换”** 是一个特殊的前置操作，专门用于将 `{{variable}}` 这样的变量占位符替换为当前环境中定义的实际值。

<Background>

![image.png](https://api.apifox.com/api/v1/projects/5097254/resources/480122/image-preview)
</Background>

大多数前置操作会在变量替换之前执行，这是 Apifox 中的默认执行顺序。然而，某些操作 *（例如接口签名脚本）* 需要在变量替换后才能生效。在这种情况下，你需要手动将这些操作移到 “变量替换 & 继承自父级” 步骤之后。

此外，你还可以在父级前置操作部分，将操作拖动到变量替换之后。这些操作随后会出现在 “变量替换 & 继承自父级” 步骤中的 “继承自父级” 部分。

### 执行顺序

单个请求的操作执行顺序如下图所示：


<Background>

![image.png](https://api.apifox.com/api/v1/projects/5097254/resources/497296/image-preview)
</Background>

