# HTTP 请求 (/zh/docs/requests)

请求是对 API 的一次已存储调用：它的方法、URL、标头、正文、认证和设置，都作为一个文件保存在你的工作区中。本页完整介绍 HTTP
请求。其他类型的请求（GraphQL、gRPC、WebSocket 与 SSE、Socket.IO、MQTT 和 MCP 调用）使用同一个页面，只是标签页不同；
见末尾的[请求类型](#request-kinds)。

## 创建请求 [#create-a-request]

- 选取 **文件 › 新建请求**（<kbd>⌘</kbd><kbd>N</kbd>）。请求会添加到你在边栏中选中的文件夹里，名为 **新建请求**，并在标签页中打开。
- 或者点按边栏中 **请求** 旁边的 **+** 菜单，然后选取 **新建请求**。同一个菜单还能创建其他类型的请求和文件夹，以及导入文件。
- 或者在边栏中右键点按某个文件夹，选取 **新建请求**，直接把请求放进该文件夹。
- 要从 cURL 命令开始，先创建一个请求，再把命令粘贴到 URL 字段中。Echolot 会据此填入方法、URL、标头、正文、认证和设置。
  它无法接受的选项会在 URL 栏下方显示为 **cURL 备注**；点按它们即可查看被略去的内容。

用 **编辑 › 重新命名** 或在边栏中右键点按请求来重新命名。**编辑 › 复制**（<kbd>⌘</kbd><kbd>D</kbd>）会在旁边生成一份副本。

## 请求页面 [#the-request-page]

<Shot id="requests-http-page" alt="List products 的请求页面：顶部是 URL 栏，左侧是请求的标签页，右侧是 JSON 响应" />

从上到下依次是：

1. **URL 栏**：方法、URL 和 **发送**。
2. **下方的一行**：实际将要发送的 URL，其中每个变量都已用当前环境的值填入（机密保持遮蔽）；发送之后，右侧还会显示状态、这次交换的时间线和耗时。
3. **两个窗格**：一侧是请求的标签页，另一侧是响应。

请求的标签页有 **文档**、**标头**、**参数**、**正文**、**认证**、**变量**、**测试**、**脚本** 和 **设置**。有内容的标签页会显示一个圆点或计数，
所以你一眼就能看出某个请求带有三个标头或一个正文。

两个窗格可以左右并排，也可以上下堆叠。选取 **视图 › 窗格**，在 **并排** 和 **堆叠** 之间切换；这个选择会按请求类型分别记住。拖移分隔线可调整窗格大小，
选取 **视图 › 窗格 › 重置窗格大小** 可恢复默认大小。窗口太窄、容不下并排的两个窗格时，它们会自动堆叠。

## 方法和 URL [#method-and-url]

点按方法标记，选择 **GET**、**POST**、**PUT**、**PATCH**、**DELETE**、**HEAD** 或 **OPTIONS**。

在旁边的字段中输入 URL。URL 的任何位置都可以使用 `{{variables}}`，例如 `{{baseURL}}/products`。输入 `{{` 时，会打开一个列表，
列出当前范围内的变量和[动态值](/docs/requests/dynamic-values)。变量显示为一个胶囊标记；将指针停留在上面可查看它的值，连按两下可更改它。变量来自
[环境、工作区和文件夹](/docs/workspaces/environments)。

如果 URL 中有内容无法解析，URL 栏下方的那一行会显示 **1 个问题**（或相应数量）。点按它可查看缺少哪些变量。无法解析的标记会按原样发送。

当请求读取另一个请求的响应（例如通过 `{{$response('auth/sign-in', '$.access_token')}}`），而那个请求还没有响应时，这一行会显示
**先发送“Sign in”**：Echolot 会先发送那个请求，再发送当前请求。

## 查询参数 [#query-parameters]

**参数** 标签页把 URL 的查询部分显示为 **键** 和 **值** 的行。两者保持同步：编辑某一行，URL 随之改变；在 URL 中输入 `?page=2`，就会出现一行。

- 点按 **添加参数** 添加一个。
- 取消勾选某一行即可停止发送它。取消勾选的参数仍保留在请求中，但不再出现在 URL 里。
- 你在名称或值中输入的 `&`、`#` 和空格会自动做百分号编码。

## 标头 [#headers]

**标头** 标签页按你设置的顺序列出你设置的标头，名称的大小写保持原样。

- 点按 **添加标头** 并输入名称。Echolot 会补全标头名称，并注明每个标头的用途；选定名称后，它还会给出常用的值。
- 取消勾选某个标头，即可保留它但不发送。
- 拖移某一行的手柄可调整顺序，也可以右键点按它，选取 **上移**、**下移** 或 **移除**。
- 点按 **批量编辑**，以文本形式编辑所有标头，每行一个 `Name: value`。以 `//` 开头的行是已关闭的标头。

在你的标头下方，**自动生成** 列出 Echolot 在发送时添加的内容：由你的认证、正文类型和 Cookie 存储生成的标头，以及每个 HTTP 请求都需要的标头。
它们按实际发出的样子显示，凭据已被遮蔽。将指针停留在某一项上，可查看它的来源。要改为发送你自己的值，
可以添加同名标头，或右键点按该行并选取 **替换为我自己的**。你自己写的 `Authorization` 标头会取代 **认证** 标签页将要添加的那个。

要让 Echolot 不再添加它自己的标头，请在[设置标签页](/docs/requests/settings#raw-mode)中打开 **原始模式**。

## 正文、认证和设置 [#body-auth-and-settings]

- **正文**：JSON、URL 编码表单和多部分表单、GraphQL、文本、XML、HTML，或一个文件。见[请求正文](/docs/requests/body)。
- **认证**：Basic、Bearer、API 密钥、OAuth 2.0、AWS 签名等，或沿用文件夹的认证。见[认证](/docs/requests/auth)。
- **设置**：HTTP 版本、重定向、Cookie、TLS、超时和原始模式。见[请求设置](/docs/requests/settings)。
- **变量**：只有这个请求使用的值，以及它从响应中保留的值。见[响应捕获](/docs/requests/captures)。
- **测试** 和 **脚本**：对响应的检查，以及发送前后运行的 JavaScript。见[脚本和测试](/docs/requests/scripts-and-tests)。
- **文档**：关于这个请求用途的备注，写给你自己和你的团队。

## 发送和取消 [#send-and-cancel]

点按 **发送**，或按 <kbd>⌘</kbd><kbd>R</kbd>。在 URL 字段中按 <kbd>↩</kbd> 和按 <kbd>⌘</kbd><kbd>↩</kbd> 同样会发送。菜单栏中的
**请求 › 发送** 也一样。

请求运行期间，**发送** 会变成 **取消**：点按它或按 <kbd>⌘</kbd><kbd>.</kbd> 即可停止。响应在到达时就流入响应窗格，所以在大正文全部到达之前，你就能读到它的开头。

当窗口的环境受保护时，按钮会显示 **发送到 Production…**（带环境名称），每次发送都会先询问。见[受保护的环境](/docs/workspaces/protected-environments)。

对当前请求的其他操作在 **请求** 菜单中：

| 菜单项 | 快捷键 | 作用 |
| --- | --- | --- |
| **拷贝为 cURL** | <kbd>⌥</kbd><kbd>⌘</kbd><kbd>C</kbd> | 把请求拷贝为 `curl` 命令。 |
| **生成代码…** | <kbd>⌥</kbd><kbd>⌘</kbd><kbd>G</kbd> | 把请求显示为代码：cURL、Swift (URLSession)、JavaScript (fetch、axios)、TypeScript (fetch)、Python (requests、httpx)、Go (net/http)、Kotlin (OkHttp)、Java (HttpClient)、C# (HttpClient)、PHP (cURL) 或 Rust (reqwest)。 |
| **将交换记录导出为 HAR…** | | 把最近一次交换存储为 HAR 文件。 |
| **在正文中查找** | <kbd>⌘</kbd><kbd>F</kbd> | 在响应正文中搜索。 |

**生成代码…** 会填入请求的变量。脚本不会运行，机密会原样出现，所以粘贴代码时要留意去向。该面板中的 **打开模板文件夹** 会显示生成代码所用的模板。

## 标签页 [#tabs]

你打开的每个请求都会在编辑器上方获得一个标签页。

| 操作 | 方法 |
| --- | --- |
| 下一个标签页 | **标签页 › 显示下一个标签页**，<kbd>⇧</kbd><kbd>⌘</kbd><kbd>]</kbd> |
| 上一个标签页 | **标签页 › 显示上一个标签页**，<kbd>⇧</kbd><kbd>⌘</kbd><kbd>[</kbd> |
| 关闭标签页 | **文件 › 关闭标签页**，<kbd>⌘</kbd><kbd>W</kbd> |
| 重新打开最近关闭的标签页 | **标签页 › 重新打开已关闭的标签页**，<kbd>⇧</kbd><kbd>⌘</kbd><kbd>T</kbd> |

## 存储 [#saving]

没有“存储”命令：每次编辑都会在你做出修改后片刻自动存入请求的文件，并且每次编辑都可以用 **编辑 › 撤销**（<kbd>⌘</kbd><kbd>Z</kbd>）撤销。关闭标签页或退出时，会等到最后一次编辑写入完成。

如果文件在磁盘上发生了变化，而你还有 Echolot 尚未写入的编辑（例如执行 `git pull` 之后），会出现一个提示栏，显示 **此请求已在磁盘上更改**。选取 **保留我的版本**
可保留你的编辑并写入覆盖该文件，选取 **使用文件中的版本** 则会放弃你的编辑并载入该文件。见 [Git 与团队协作](/docs/workspaces/git-and-teams)。

## 响应一览 [#the-response-at-a-glance]

<Shot id="requests-http-exchange-card" alt="响应上方的详情卡片：状态 200、耗时、大小、TLS 版本，以及交换每个阶段对应的一条横条" />

发送之后，URL 栏下方的那一行会显示状态（2xx 为绿色，依此类推）、这次交换各阶段的横条，以及总耗时。将指针停留在这一行上可查看详情：大小、压缩、重定向、检查、TLS、
服务器地址，以及每个阶段花了多长时间。

响应窗格提供正文的多种视图，以及标头、Cookie、原始消息、十六进制视图和线路上的字节。这一行末尾带计数的时钟按钮会打开这个请求更早的响应。见[响应](/docs/requests/responses)。

首次发送之前，响应窗格显示 **发送一个 Ping**。

## 请求类型 [#request-kinds]

同一个请求页面可以发送 Echolot 支持的所有协议。从 **文件** 菜单或边栏的 **+** 菜单创建。

| 类型 | 菜单项 | 页面 |
| --- | --- | --- |
| HTTP | **新建请求** | 本页 |
| GraphQL | **新建 GraphQL 请求** | [GraphQL](/docs/requests/graphql) |
| gRPC | **新建 gRPC 请求** | [gRPC](/docs/requests/grpc) |
| WebSocket | **新建 WebSocket 请求** | [WebSocket 与 SSE](/docs/requests/websocket-and-sse) |
| Server-Sent Events | **新建请求**（服务器流式推送事件的 HTTP 请求） | [WebSocket 与 SSE](/docs/requests/websocket-and-sse) |
| Socket.IO | **新建 Socket.IO 请求** | [Socket.IO](/docs/requests/socket-io) |
| MQTT | **新建 MQTT 请求** | [MQTT](/docs/requests/mqtt) |
| MCP | **新建 MCP 调用**（边栏 **+** 菜单） | [MCP 请求](/docs/requests/mcp-requests) |

要连续发送许多请求，并使用检查和数据文件，请用[运行器](/docs/requests/runner)。
