响应 (Response)

Response 类表示通过 fetch() 方法发起的网络请求返回的响应结果。 它提供了访问响应体(body)、头部(headers)、状态码、MIME 类型、以及服务器返回的 Cookies 的接口。

Scripting app 中,Response 的设计基于标准 Fetch API,但进行了原生扩展,支持:

  • 原生级 Cookie 访问与解析
  • 二进制数据 (Data) 支持
  • 流式响应 (ReadableStream<Data>) 读取
  • 响应的 MIME 类型、编码信息与预期长度
  • 完整兼容标准 Web Fetch 行为

定义

1class Response {
2  readonly body: ReadableStream<Data>
3  
4  constructor(body: ReadableStream<Data>, init?: ResponseInit)
5
6  get bodyUsed(): boolean
7  get cookies(): Cookie[]
8  json(): Promise<any>
9  text(): Promise<string>
10  data(): Promise<Data>
11  bytes(): Promise<Uint8Array>
12  arrayBuffer(): Promise<ArrayBuffer>
13  formData(): Promise<FormData>
14  get status(): number
15  get statusText(): string
16  get headers(): Headers
17  get ok(): boolean
18  get url(): string
19  get mimeType(): string | undefined
20  get expectedContentLength(): number | undefined
21  get textEncodingName(): string | undefined
22}

属性说明

属性 类型 说明
body ReadableStream<Data> 响应体数据的可读流。
bodyUsed boolean 指示响应体是否已被读取。
cookies Cookie[] 服务器通过 Set-Cookie 返回的 Cookie 列表。
status number HTTP 状态码(如 200404500)。
statusText string 状态描述(如 "OK""Not Found")。
headers Headers 响应头对象。
ok boolean 当状态码在 200–299 范围内时为 true
url string 响应的最终 URL(可能经过重定向)。
mimeType string | undefined 响应的 MIME 类型(如 "application/json")。
expectedContentLength number | undefined 响应体的预期长度(字节),由服务器提供。
textEncodingName string | undefined 文本编码方式(如 "utf-8")。

方法说明

json(): Promise<any>

将响应体解析为 JSON 对象。

示例

1const response = await fetch("https://api.example.com/user")
2const data = await response.json()
3console.log(data.name)

text(): Promise<string>

将响应体读取为字符串。 默认使用 UTF-8 编码,若服务器返回了编码信息则自动识别。

示例

1const response = await fetch("https://example.com/message.txt")
2const text = await response.text()
3console.log(text)

data(): Promise<Data>

将响应体读取为二进制数据对象 Data,适合文件下载、图片处理、或转换为 Base64。

示例

1const response = await fetch("https://example.com/image.png")
2const imageData = await response.data()
3FileManager.write(imageData, "/local/image.png")

bytes(): Promise<Uint8Array>

将响应体读取为字节数组。

示例

1const response = await fetch("https://example.com/file.bin")
2const bytes = await response.bytes()
3console.log("Received", bytes.length, "bytes")

arrayBuffer(): Promise<ArrayBuffer>

将响应体读取为 ArrayBuffer,适合进行底层二进制操作。

示例

1const response = await fetch("https://example.com/file")
2const buffer = await response.arrayBuffer()
3console.log(buffer.byteLength)

formData(): Promise<FormData>

将响应体解析为 FormData(适用于 multipart/form-data 类型的响应)。

示例

1const response = await fetch("https://example.com/form")
2const form = await response.formData()
3console.log(form.get("username"))

Cookies 支持

Scripting 的 Response 支持直接访问服务器返回的 Set-Cookie 信息。 返回值为一个 Cookie 对象数组,每个元素包含完整的 Cookie 元数据。

1interface Cookie {
2  name: string
3  value: string
4  domain: string
5  path: string
6  isSecure: boolean
7  isHTTPOnly: boolean
8  isSessionOnly: boolean
9  expiresDate?: Date | null
10}
字段 类型 说明
name string Cookie 名称。
value string Cookie 值。
domain string 所属域名。
path string 作用路径。
isSecure boolean 是否仅通过 HTTPS 发送。
isHTTPOnly boolean 是否为 HTTP-only,无法被脚本访问。
isSessionOnly boolean 是否为会话 Cookie(无过期时间)。
expiresDate Date | null 过期时间(若有设置)。

示例:读取响应中的 Cookies

1const response = await fetch("https://example.com/login")
2for (const cookie of response.cookies) {
3  console.log(`${cookie.name} = ${cookie.value}`)
4}

示例:手动管理 Cookie(跨请求复用)

默认情况下,Scripting 的 fetch() 不会自动存储或携带 Cookie。 如果希望在多次请求中复用 Cookie,可以手动拼接 Cookie 头:

1const response = await fetch("https://example.com/login")
2const cookies = response.cookies
3const cookieHeader = cookies.map(c => `${c.name}=${c.value}`).join("; ")
4
5const next = await fetch("https://example.com/dashboard", {
6  headers: { "Cookie": cookieHeader },
7})

这种方式让开发者能够像浏览器开发者工具一样 完全掌控 Cookie 的发送与存储


与其他类的关系

类名 说明
Request 表示生成此响应的请求对象。
Headers 用于访问响应头部信息。
Data 表示响应体的二进制数据。
FormData 表示 multipart/form-data 格式的表单响应。
Cookie 表示服务器返回的单个 Cookie 对象。

使用示例

示例 1:处理 JSON API 响应

1const response = await fetch("https://api.example.com/profile")
2if (response.ok) {
3  const user = await response.json()
4  console.log(user.email)
5} else {
6  console.log("请求失败:", response.status, response.statusText)
7}

示例 2:下载文件并保存

1const response = await fetch("https://example.com/photo.jpg")
2const fileData = await response.data()
3FileManager.write(fileData, "/local/photo.jpg")

示例 3:读取服务器返回的 Cookies

1const response = await fetch("https://example.com/login")
2for (const cookie of response.cookies) {
3  console.log(`Cookie: ${cookie.name} = ${cookie.value}`)
4}

示例 4:跨请求手动复用 Cookies

1const loginResponse = await fetch("https://example.com/login", {
2  method: "POST",
3  body: JSON.stringify({ username: "Tom", password: "1234" }),
4  headers: { "Content-Type": "application/json" },
5})
6
7// 读取 Cookie 并拼接成请求头
8const cookieHeader = loginResponse.cookies.map(c => `${c.name}=${c.value}`).join("; ")
9
10// 携带 Cookie 发起新请求
11const dashboard = await fetch("https://example.com/dashboard", {
12  headers: { "Cookie": cookieHeader },
13})
14console.log(await dashboard.text())

示例 5:读取响应的元信息

1const response = await fetch("https://example.com/video.mp4")
2console.log("MIME 类型:", response.mimeType)
3console.log("预期长度:", response.expectedContentLength)

小结

Response 是 Scripting 网络请求体系中最核心的组成部分之一,具有以下特性:

  • 完整兼容标准 Fetch API 行为
  • 新增 原生 Cookie 访问与控制 能力
  • 支持 Data 类型的 二进制数据处理
  • 支持响应流式读取、MIME 类型、编码与长度信息
  • 可与 RequestHeadersFormDataAbortController 等类型无缝配合