# 响应 (/zh/docs/requests/responses)

服务器返回的一切都显示在响应窗格中：适合其类型的视图中的正文、标头、Cookie、原样的消息，以及它的十六进制字节和传输中的字节。状态和耗时显示在 URL 栏下方的那一行。
正文在到达时就写入磁盘，所以几百 MB 的响应也能像小响应一样快地打开。

<Shot id="requests-http-response-tree" alt="List products 的响应，在 JSON 树视图中，指针悬停在一个值上，显示它的“拷贝值”和“存入变量”按钮" />

## 状态、耗时和大小 [#status-time-and-size]

发送之后，URL 栏下方的那一行显示：

- **状态**，按其类别（2xx、3xx、4xx、5xx）着色；没有得到响应的请求则改为显示 **失败** 或 **已取消**，
- 交换每个 **阶段** 对应的一条横条，在请求运行时不断增长，
- **总耗时**。

将指针停留在这一行上，会打开一张带详情的卡片：

| 卡片中的项目 | 含义 |
| --- | --- |
| 状态 | 状态码和原因短语。 |
| **时间** | 这次交换的总耗时。 |
| **大小** | 正文的大小；正文到达期间，显示已到达多少、共多少。 |
| **编码** | 压缩方式，以及解码前后的大小，例如 `br, 12 KB → 48 KB`，或无法解码的说明。 |
| **3 次重定向** | 所跟随的重定向；点按可查看每一跳的状态、方法、地址和耗时。 |
| 检查 | 请求的检查中有多少通过。 |
| **复用的连接** | 请求使用的是先前保持打开的连接：没有 DNS、连接或 TLS 耗时。 |
| TLS | TLS 版本和协议，例如 `TLS 1.3 · h2`。点按它可查看证书：主体、**颁发者**、**有效期** 日期和 **名称**。橙色的打开的锁表示验证已关闭。 |
| **提供 HTTP/3** | 服务器通过 `Alt-Svc` 提供了 HTTP/3；见 [HTTP 版本](/docs/requests/settings#http-version)。 |
| 地址 | 服务器的 IP 地址和端口。 |
| 时间线 | **DNS**、**连接**、**TLS**、**等待**（直到响应的第一个字节）和 **传输**，每项都附有耗时。 |

当请求被重新发送（在新连接上，或通过 HTTP/1.1）时，卡片会说明原因。请求失败时，卡片会显示错误。

## 响应标签页 [#the-response-tabs]

| 标签页 | 显示的内容 |
| --- | --- |
| **正文** | 正文，以你选择的视图显示。 |
| **事件** | 服务器发送事件和其他事件流，每个事件一行。见 [WebSocket 与 SSE](/docs/requests/websocket-and-sse)。 |
| **测试** | 请求的检查和脚本测试的结果，带计数，例如 `3/4`。 |
| **控制台** | 请求的脚本所记录的日志；仅在脚本运行过时显示。见[脚本和测试](/docs/requests/scripts-and-tests)。 |
| **标头** | 响应标头，带计数。 |
| **Cookie** | 发送和设置的 Cookie，以及窗口的 Cookie 存储。 |
| **原始** | 作为一条 HTTP 消息的响应：状态行、标头、一个空行和正文。 |
| **十六进制** | 正文的字节。 |
| **传输** | 发送和接收的字节，与它们在连接上传输时完全一样。 |

## 正文视图 [#body-views]

在 **正文** 标签页顶部那一行中选择视图：

| 视图 | 显示的内容 |
| --- | --- |
| **文本** | 到达时的正文，按其内容类型着色。 |
| **JSON** | 美化后的 JSON。 |
| **JSON 树** | 可展开和折叠的树形 JSON。 |
| **XML** | 以元素、属性和文本组成的树显示的 XML。 |
| **表单** | 读作树的 URL 编码正文。 |
| **MessagePack** | 读作树的 MessagePack 正文。 |
| **预览** | 通过“快速查看”显示图像、PDF、音频和视频。 |

每个视图对每种正文都可用，所以用错误的内容类型发送的响应，仍可以按它真实的类型来读。响应以哪个视图打开由内容类型决定，Echolot 会为每种正文记住你选择的视图：
在你为某个 JSON 响应选择 **JSON 树** 之后，接下来的响应会以树打开。

HTML 和脚本绝不会被运行或渲染。**预览** 和 **在默认 App 中打开** 会把它们显示为文本。

文本视图中的长行会横向滚动。点按换行按钮，或选取 **视图 › 自动换行**，即可让它们换行。**视图 › 放大代码**（<kbd>⌘</kbd><kbd>+</kbd>）、**缩小代码**（<kbd>⌘</kbd><kbd>-</kbd>）和
**实际代码大小**（<kbd>⌘</kbd><kbd>0</kbd>）会更改各处代码的大小。

## JSON 树和 XML 树 [#json-and-xml-trees]

树显示每个值的键或索引、类型和值；折叠的对象或数组会显示它包含多少项。超过 1,000 项的数组会被拆分成 `[0 … 999]` 之类的范围，所以再大的数组也能立即打开。

将指针停留在某个值上，会出现它的按钮：

- **在浏览器中打开**，用于是网址的值，
- **拷贝值**，
- **存入变量…**，它把值保留在变量中，并且如果你愿意，会在每次发送后更新它。见[响应捕获](/docs/requests/captures#store-a-value-from-the-response)。

右键点按某一行可看到更多：

- 在 JSON 树中：**拷贝路径**（指向该值的 JSONPath，例如 `$.items[0].sku`）、**拷贝值** 和 **添加断言**，后者会在 **测试** 标签页中添加一项检查，要求该值等于它现在的值。
- 在 XML 树中：**拷贝 XPath** 和 **拷贝值**。

将指针停留在是图像地址的值上，旁边会打开一张缩略图。图像的获取方式与浏览器获取图片一样：不带你的 Cookie 或凭据，最大 10 MB，也不会记入历史记录。
`data:image/…` 值无需任何请求即可显示。将指针停留在看起来像日期的值上（以秒、毫秒、微秒或纳秒计的 Unix 时间，或 ISO 8601 时间戳），它会显示为易读的日期。

**XML** 树接受最大 50 MB 的正文，**表单** 和 **MessagePack** 最大 64 MB。更大的请使用 **文本** 并查找。

## 查找 [#find]

按 <kbd>⌘</kbd><kbd>F</kbd>（**请求 › 在正文中查找**）或点按放大镜。

- 在 **文本** 和 **JSON** 中，输入要查找的内容。**Aa** 区分大小写；**.\*** 将其作为正则表达式。栏中会显示你所在的位置，例如 `3 of 1,204`。按 <kbd>↩</kbd> 或 <kbd>⌘</kbd><kbd>G</kbd> 查找下一个匹配项，
  按 <kbd>⇧</kbd><kbd>⌘</kbd><kbd>G</kbd> 查找上一个。最多标出 10,000 个匹配项；更多时计数会显示 `+`。
- 在 **JSON 树**、**表单** 和 **MessagePack** 中，栏接受 `$.items[0]` 之类的 JSONPath，并跳转到该值。那里什么都没有时，会显示 **未找到**。

按 <kbd>Esc</kbd> 关闭这一栏。

## 大型响应 [#large-responses]

Echolot 绝不会把正文留在内存中。它在正文到达时流式写入文件，而查看器只读取屏幕上的那一部分：

- 其余部分仍在到达时，开头的几行就已经显示。正文下载期间，详情卡片会显示已到达多少。
- **JSON** 在正文一开始就开始美化，并随着它的增长而跟进。
- **JSON 树** 只构建你展开的行。
- 查找会搜索磁盘上的整个正文。

可以用 Alpenglow 中的 **Catalog › Export the catalog** 试一试：40,000 个产品，约 14 MB。

正文在磁盘上最多保留到 **设置 › 储存空间 › 响应正文最多保留** 所设的大小；超过之后，最久未使用的会被移除，在标签页中打开的正文除外。正文已被移除的较早响应会显示 **此响应的正文已不再储存。**
见[储存与加密](/docs/workspaces/storage-and-encryption)。

## 标头 [#headers]

**标头** 标签页按响应标头到达的顺序列出它们。将指针停留在某一行上，或选中它并按 <kbd>Space</kbd>（用 <kbd>↑</kbd> 和 <kbd>↓</kbd> 移动），可查看完整的值、
标头的用途以及它的值表示什么。右键点按标头，可选取 **拷贝值**、**拷贝标头** 和 **添加检查**，后者会在 **测试** 标签页中添加针对该标头的检查。

## Cookie [#cookies]

**Cookie** 标签页有三个部分：

- **随请求发送**：发出的 Cookie，以及每个的来源。
- **由响应设置**：每个 `Set-Cookie`，带它的属性，以及存储拒绝它时的警告。
- **储存在此窗口中**：窗口的 Cookie 存储中的所有内容。用它的按钮移除一个，或用 **全部清除** 移除全部。

当请求的 **发送并储存 Cookie** 关闭时，标签页会说明这一点。见 [Cookie](/docs/requests/settings#cookies)。

## 原始、十六进制和传输 [#raw-hex-and-wire]

- **原始** 把响应显示为一条消息：状态行、标头、一个空行，然后是解码后的正文（它的前 64 MB；**正文** 标签页有全部内容）。
- **十六进制** 显示正文的字节：偏移量、每行 16 个字节分成两组，以及它们的 ASCII。用鼠标，或用方向键和 <kbd>⇧</kbd> 选择字节；拷贝得到十六进制数对，在 ASCII 列中选择时则得到文本。
- **传输** 显示字节，与它们在连接上传输时完全一样：选取 **已发送** 或 **已接收**。你能看到分帧后的标头，以及解码之前的压缩正文。每个方向最多保留 1 MB；标签页只显示前一部分时会说明。

## 存储和分享 [#save-and-share]

点按 **正文** 标签页右上角的存储按钮：

- **存储正文…** 把正文（已解码）写入文件。
- **在默认 App 中打开** 用你的 Mac 为其类型所用的 App 打开它。
- **存储编码的正文…** 按到达时的样子写出正文，仍保持压缩；仅用于压缩的响应。
- **将交换记录导出为 HAR…** 把请求和响应写成 HAR 文件。

要分享请求而不是响应，请使用 **请求 › 拷贝为 cURL**（<kbd>⌥</kbd><kbd>⌘</kbd><kbd>C</kbd>）或 **请求 › 生成代码…**（<kbd>⌥</kbd><kbd>⌘</kbd><kbd>G</kbd>）。见 [HTTP 请求](/docs/requests#send-and-cancel)。

## 较早的响应和比较 [#earlier-responses-and-comparing]

每次发送都保存在历史记录中。URL 栏下方那一行末尾带计数的时钟按钮，会打开这个请求的各个响应：每个都带有状态、时间、发送者（你、一次运行或一个智能体）、时长和大小。

<Shot id="requests-http-response-history" alt="List products 的响应历史弹出窗口，列出较早的响应及其状态、时间、来源、时长和大小" />

- 点按某个响应即可显示它。响应窗格上方的一条栏显示 **过去的响应**；**显示最新** 回到最新的响应。
- 要比较两个响应，先显示一个，然后将指针停留在列表中的另一个上并点按它的比较按钮，或点按 **过去的响应** 栏中的 **与最新响应比较**。比较会显示新增和移除的内容。
- 列表菜单中的 **清除此请求的历史记录…** 会删除这个请求的历史记录。

整个工作区的历史记录见[历史记录](/docs/workspaces/history)。

## 请求失败时 [#when-a-request-fails]

没有收到响应时，窗格会显示错误，例如 **请求超时**，以及 **再试一次**。还可能出现另外两个按钮：

- **查看脚本…**，当请求的脚本来自 Echolot 之外、需要你信任之后才能运行时出现。见[脚本和测试](/docs/requests/scripts-and-tests)。
- **允许访问…**，在 App Store 版本中，当请求指向应用尚不能读取的文件时出现。
