@doubao-dev/plugin-app-dev 0.0.0-stage → 0.0.40-canary-dea0ddc73-20261026073950
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -2
- package/dist/147.js +9 -0
- package/dist/assets.d.ts +5 -0
- package/dist/assets.js +4 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.js +1378 -0
- package/dist/plugin.d.ts +102 -0
- package/dist/plugin.js +4995 -0
- package/dist/preview.js +16 -0
- package/dist/rslib-runtime.js +33 -0
- package/dist/skills/doubao-plugin-app/SKILL.md +21 -0
- package/dist/skills/doubao-plugin-app/references/app-development.md +85 -0
- package/dist/skills/doubao-plugin-app/references/frontend/components/container-overlay.md +131 -0
- package/dist/skills/doubao-plugin-app/references/frontend/components/form-controls.md +146 -0
- package/dist/skills/doubao-plugin-app/references/frontend/components/interactive-controls.md +120 -0
- package/dist/skills/doubao-plugin-app/references/frontend/components/map-canvas.md +107 -0
- package/dist/skills/doubao-plugin-app/references/frontend/components/overview.md +43 -0
- package/dist/skills/doubao-plugin-app/references/frontend/components/scroll-list.md +149 -0
- package/dist/skills/doubao-plugin-app/references/frontend/components/text-media.md +209 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/01-/345/237/272/347/241/200.md +1389 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/02-/347/263/273/347/273/237.md +1376 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/03-/350/207/252/345/256/232/344/271/211/351/200/232/344/277/241.md +127 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/04-/345/256/232/344/275/215.md +784 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/05-/345/255/230/345/202/250.md +1176 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/06-/350/267/257/347/224/261.md +839 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/07-/347/225/214/351/235/242.md +376 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/08-/344/272/244/344/272/222.md +1319 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/09-/350/276/223/345/205/245.md +192 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/10-/347/275/221/347/273/234.md +900 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/11-/345/252/222/344/275/223.md +1496 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/12-/344/270/232/345/212/241/350/203/275/345/212/233.md +1281 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/13-/347/231/273/345/275/225.md +511 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/14-/346/224/257/344/273/230.md +943 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/15-/346/225/260/346/215/256/345/210/206/346/236/220.md +124 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/16-/350/223/235/347/211/231.md +3364 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/17-wi-fi.md +1028 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/18-/345/212/240/351/200/237/345/272/246/350/256/241.md +354 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/19-ibeacon.md +508 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/20-/347/275/227/347/233/230.md +320 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/21-/350/256/276/345/244/207/346/226/271/345/220/221.md +351 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/22-/351/231/200/350/236/272/344/273/252.md +354 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/23-/345/252/222/344/275/223-/350/256/276/345/244/207-/347/275/221/347/273/234.md +264 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/24-/347/237/255/344/277/241.md +155 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/25-/346/227/240/351/232/234/347/242/215.md +144 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/26-/345/237/272/347/241/200/344/277/241/346/201/257.md +238 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/27-/347/224/265/346/261/240.md +235 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/28-/345/211/252/350/264/264/346/235/277.md +303 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/29-/345/212/240/345/257/206.md +126 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/30-/346/227/245/345/216/206.md +417 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/31-/347/224/265/350/257/235.md +144 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/32-/346/211/253/347/240/201.md +236 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/33-/345/261/217/345/271/225.md +747 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/34-/351/234/207/345/212/250.md +277 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/35-/346/226/207/344/273/266/347/263/273/347/273/237.md +431 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/common-errors.md +69 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/groups.md +43 -0
- package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/quick-reference.md +436 -0
- package/dist/skills/doubao-plugin-app/references/frontend/examples/common-patterns.md +590 -0
- package/dist/skills/doubao-plugin-app/references/frontend/examples/doubao-agentic-service-api-recipes.md +209 -0
- package/dist/skills/doubao-plugin-app/references/frontend/examples/page-widget-basics.md +368 -0
- package/dist/skills/doubao-plugin-app/references/frontend/examples/page-widget-recipes.md +65 -0
- package/dist/skills/doubao-plugin-app/references/frontend/framework/core.md +283 -0
- package/dist/skills/doubao-plugin-app/references/frontend/guides/auth.md +277 -0
- package/dist/skills/doubao-plugin-app/references/frontend/guides/best-practices.md +574 -0
- package/dist/skills/doubao-plugin-app/references/frontend/guides/client-tools-and-events.md +209 -0
- package/dist/skills/doubao-plugin-app/references/frontend/guides/component-development.md +832 -0
- package/dist/skills/doubao-plugin-app/references/frontend/guides/debugger-mcp.md +537 -0
- package/dist/skills/doubao-plugin-app/references/frontend/guides/expired-widget.md +101 -0
- package/dist/skills/doubao-plugin-app/references/frontend/guides/performance-optimization.md +417 -0
- package/dist/skills/doubao-plugin-app/references/frontend/guides/troubleshooting.md +278 -0
- package/dist/skills/doubao-plugin-app/references/frontend/lynx/best-practices.md +720 -0
- package/dist/skills/doubao-plugin-app/references/frontend/lynx/css/pseudo-classes.md +149 -0
- package/dist/skills/doubao-plugin-app/references/frontend/lynx/css/selectors.md +224 -0
- package/dist/skills/doubao-plugin-app/references/frontend/lynx/css/supported-properties.md +269 -0
- package/dist/skills/doubao-plugin-app/references/frontend/lynx/css/values-and-units.md +314 -0
- package/dist/skills/doubao-plugin-app/references/frontend/lynx/layout/flex-layout.md +334 -0
- package/dist/skills/doubao-plugin-app/references/frontend/lynx/layout/grid-layout.md +408 -0
- package/dist/skills/doubao-plugin-app/references/frontend/lynx/layout/linear-layout.md +355 -0
- package/dist/skills/doubao-plugin-app/references/frontend/lynx/layout/relative-layout.md +189 -0
- package/dist/skills/doubao-plugin-app/references/frontend/lynx/lynx-vs-web/css-differences.md +737 -0
- package/dist/skills/doubao-plugin-app/references/frontend/lynx/lynx-vs-web/migration-guide.md +669 -0
- package/dist/skills/doubao-plugin-app/references/frontend/lynx/lynx-vs-web/unsupported-features.md +290 -0
- package/dist/skills/doubao-plugin-app/references/frontend/lynx/overview.md +60 -0
- package/dist/skills/doubao-plugin-app/references/frontend/lynx/patterns/animation.md +243 -0
- package/dist/skills/doubao-plugin-app/references/frontend/lynx/patterns/responsive.md +194 -0
- package/dist/skills/doubao-plugin-app/references/frontend/lynx/patterns/theming.md +143 -0
- package/dist/skills/doubao-plugin-app/references/frontend/lynx/quick-reference.md +229 -0
- package/dist/skills/doubao-plugin-app/references/frontend/rules/dos-and-donts.md +479 -0
- package/dist/skills/doubao-plugin-app/references/frontend/widget-templates/design-boundary.md +46 -0
- package/dist/skills/doubao-plugin-app/references/frontend/widget-templates/overview.md +118 -0
- package/dist/skills/doubao-plugin-app/references/frontend/widget-templates/props.md +301 -0
- package/dist/skills/doubao-plugin-app/references/mcp-and-cards.md +38 -0
- package/dist/templates/README.md.template +11 -0
- package/dist/templates/com.doubao/app/manifest.yaml +41 -0
- package/dist/templates/com.doubao/app/package.json.template +13 -0
- package/dist/templates/com.doubao/app/src/app.config.ts.template +5 -0
- package/dist/templates/com.doubao/app/src/app.ts.template +3 -0
- package/dist/templates/com.doubao/app/src/pages/home/index.css +14 -0
- package/dist/templates/com.doubao/app/src/pages/home/index.tsx.template +14 -0
- package/dist/templates/com.doubao/app/src/widgets/example/index.tsx.template +29 -0
- package/dist/templates/com.doubao/app/tsconfig.json +19 -0
- package/dist/templates/mcp.json +9 -0
- package/dist/templates/plugin.json.template +29 -0
- package/dist/templates/skills/example/SKILL.md.template +14 -0
- package/dist/upload.d.ts +44 -0
- package/dist/upload.js +38 -0
- package/package.json +60 -3
|
@@ -0,0 +1,900 @@
|
|
|
1
|
+
# 豆包应用插件的端能力 API: 网络
|
|
2
|
+
|
|
3
|
+
网络请求与 WebSocket。
|
|
4
|
+
|
|
5
|
+
[返回目录](./groups.md) | [返回速查](./quick-reference.md)
|
|
6
|
+
|
|
7
|
+
## 速查
|
|
8
|
+
|
|
9
|
+
| API | 说明 |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| [request](#request) | 发起网络请求。 request 本身不接受泛型参数;如需业务数据类型,请读取 result.data 后再做类型收窄或断言。 |
|
|
12
|
+
| [connectSocket](#connectsocket) | 创建一个 WebSocket 连接,并返回可操作该连接的 SocketTask。 该 API 会同步返回 SocketTask,但连接创建本身是异步过程。调用方应先在返回的 SocketTask 上注册事件回调,再等待 onOpen 表示连接可用。后续发送消息使用 SocketTask.send,关闭连接使用 SocketTask.close。 |
|
|
13
|
+
| [uploadFile](#uploadfile) | 上传本地文件,并返回可用于监听进度和中断上传的 UploadTask。 |
|
|
14
|
+
| [downloadFile](#downloadfile) | 下载文件,并返回可取消、可监听进度的 DownloadTask。 |
|
|
15
|
+
|
|
16
|
+
## API 详情
|
|
17
|
+
|
|
18
|
+
<a id="request"></a>
|
|
19
|
+
### request()
|
|
20
|
+
|
|
21
|
+
# request
|
|
22
|
+
|
|
23
|
+
发起网络请求。
|
|
24
|
+
|
|
25
|
+
`request` 本身不接受泛型参数;如需业务数据类型,请读取 `result.data` 后再做类型收窄或断言。
|
|
26
|
+
|
|
27
|
+
## 扫码预览
|
|
28
|
+

|
|
29
|
+
|
|
30
|
+
## 使用限制
|
|
31
|
+
|
|
32
|
+
> [!WARNING]
|
|
33
|
+
> **Android、iOS**:Android 仅支持 GET/POST/PUT/DELETE,其余方法返回 "Illegal method";iOS 仅支持 GET/POST,其余方法返回 "method type not supported";调用 PUT/DELETE 时 iOS 会失败;调用 HEAD/OPTIONS/TRACE/CONNECT 时双端均失败。
|
|
34
|
+
> **Android、iOS**:Android 将二进制响应以 base64 字符串返回;iOS doubao.request 路径不启用 arraybuffer 支持,返回 base64 编码字符串;调用方按 ArrayBuffer 解析会失败。
|
|
35
|
+
|
|
36
|
+
## 支持版本
|
|
37
|
+
|
|
38
|
+
前端库版本不低于 `0.0.17`。
|
|
39
|
+
|
|
40
|
+
## 支持平台
|
|
41
|
+
|
|
42
|
+
<table>
|
|
43
|
+
<thead>
|
|
44
|
+
<tr><th>平台</th><th>支持情况</th></tr>
|
|
45
|
+
</thead>
|
|
46
|
+
<tbody>
|
|
47
|
+
<tr><td>Android</td><td>支持</td></tr>
|
|
48
|
+
<tr><td>iOS</td><td>支持</td></tr>
|
|
49
|
+
<tr><td>PC</td><td>不支持</td></tr>
|
|
50
|
+
<tr><td>HarmonyOS</td><td>不支持</td></tr>
|
|
51
|
+
</tbody>
|
|
52
|
+
</table>
|
|
53
|
+
|
|
54
|
+
## 支持场景
|
|
55
|
+
|
|
56
|
+
<table>
|
|
57
|
+
<thead>
|
|
58
|
+
<tr><th>场景</th><th>支持情况</th></tr>
|
|
59
|
+
</thead>
|
|
60
|
+
<tbody>
|
|
61
|
+
<tr><td>页面</td><td>支持</td></tr>
|
|
62
|
+
<tr><td>卡片</td><td>支持</td></tr>
|
|
63
|
+
</tbody>
|
|
64
|
+
</table>
|
|
65
|
+
|
|
66
|
+
## 使用说明
|
|
67
|
+
|
|
68
|
+
返回 statusCode、header 和 data。
|
|
69
|
+
|
|
70
|
+
## 调用方式
|
|
71
|
+
|
|
72
|
+
### 异步 API
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
request(params: RequestParams): Promise<RequestResponse>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## 入参
|
|
79
|
+
|
|
80
|
+
<table>
|
|
81
|
+
<thead>
|
|
82
|
+
<tr><th>名称</th><th>类型</th><th>必填</th><th>默认值</th><th>约束</th><th>说明</th></tr>
|
|
83
|
+
</thead>
|
|
84
|
+
<tbody>
|
|
85
|
+
<tr><td><code>data</code></td><td><code>string | ArrayBuffer | Record<string, any></code></td><td>否</td><td><code>-</code></td><td>-</td><td>请求体数据。<br><br>传给服务器的数据最终会是 `String` 或 `ArrayBuffer`:<br>- 若 `data` 是 `string` 或 `ArrayBuffer`,直接使用;<br>- 若 `header['content-type']` 是 `application/x-www-form-urlencoded`,会被编码为 query string,例如:`encodeURIComponent(k)=encodeURIComponent(v)`;<br>- 若 `header['content-type']` 是 `application/json`,会执行 JSON 序列化;<br>- 若 `data` 是普通对象且未命中上述类型,也会执行 JSON 序列化;<br>- 其他类型会调用 `toString()`</td></tr>
|
|
86
|
+
<tr><td><code>dataType</code></td><td><code>"string" | "json" | "arraybuffer"</code></td><td>否</td><td><code>"json"</code></td><td>-</td><td>期望返回的数据格式。<br>- `json`:尝试按 JSON 解析;<br>- `string`:按字符串返回。<br>- `arraybuffer`:按二进制数据返回。</td></tr>
|
|
87
|
+
<tr><td><code>header</code></td><td><code>Record<string, string></code></td><td>否</td><td><code>{"content-type": "application/json"}</code></td><td>-</td><td>请求 Header。</td></tr>
|
|
88
|
+
<tr><td><code>method</code></td><td><code>RequestMethod</code></td><td>否</td><td><code>"GET"</code></td><td>-</td><td>请求方法。Android、iOS:Android 仅支持 GET/POST/PUT/DELETE,其余方法返回 "Illegal method";iOS 仅支持 GET/POST,其余方法返回 "method type not supported"。</td></tr>
|
|
89
|
+
<tr><td><code>url</code></td><td><code>string</code></td><td>是</td><td>-</td><td>-</td><td>请求地址,需为完整的 HTTP 或 HTTPS URL。</td></tr>
|
|
90
|
+
</tbody>
|
|
91
|
+
</table>
|
|
92
|
+
|
|
93
|
+
## 调用示例
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
import { request } from '@doubao-dev/framework/api';
|
|
97
|
+
|
|
98
|
+
const result = await request({
|
|
99
|
+
url: 'https://postman-echo.com/post',
|
|
100
|
+
method: 'POST',
|
|
101
|
+
dataType: 'json',
|
|
102
|
+
header: { 'content-type': 'application/json' },
|
|
103
|
+
data: { hello: 'world' }
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
console.log(result.statusCode, result.data);
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## 成功返回
|
|
110
|
+
|
|
111
|
+
<table>
|
|
112
|
+
<thead>
|
|
113
|
+
<tr><th>名称</th><th>类型</th><th>必返</th><th>说明</th></tr>
|
|
114
|
+
</thead>
|
|
115
|
+
<tbody>
|
|
116
|
+
<tr><td><code>data</code></td><td><code>string | ArrayBuffer | Record<string, any></code></td><td>否</td><td>响应数据,类型由 `dataType` 决定。</td></tr>
|
|
117
|
+
<tr><td><code>header</code></td><td><code>Record<string, string></code></td><td>是</td><td>HTTP 响应头。</td></tr>
|
|
118
|
+
<tr><td><code>statusCode</code></td><td><code>number</code></td><td>是</td><td>HTTP 状态码。</td></tr>
|
|
119
|
+
</tbody>
|
|
120
|
+
</table>
|
|
121
|
+
|
|
122
|
+
### 返回示例
|
|
123
|
+
|
|
124
|
+
```json
|
|
125
|
+
{
|
|
126
|
+
"statusCode": 200,
|
|
127
|
+
"header": {
|
|
128
|
+
"content-type": "application/json"
|
|
129
|
+
},
|
|
130
|
+
"data": {
|
|
131
|
+
"hello": "world"
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## 错误处理
|
|
137
|
+
|
|
138
|
+
错误对象和通用错误码见 [通用错误处理](./common-errors.md#错误返回)。
|
|
139
|
+
|
|
140
|
+
### 失败示例
|
|
141
|
+
|
|
142
|
+
```json
|
|
143
|
+
{
|
|
144
|
+
"errNo": 305,
|
|
145
|
+
"errMsg": "network failure"
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### 错误码
|
|
150
|
+
|
|
151
|
+
<table>
|
|
152
|
+
<thead>
|
|
153
|
+
<tr><th>errNo</th><th>errMsg</th><th>平台</th><th>触发条件</th><th>处理建议</th></tr>
|
|
154
|
+
</thead>
|
|
155
|
+
<tbody>
|
|
156
|
+
<tr><td><code>104</code></td><td><code>invalid parameter</code></td><td>Android、iOS</td><td>url 为空、method 非法,或请求参数、请求体校验失败</td><td>修正 url、method 与请求参数后重试。</td></tr>
|
|
157
|
+
<tr><td><code>110</code></td><td><code>API call prohibited</code></td><td>Android、iOS</td><td>请求 URL 未通过域名白名单校验</td><td>确认目标域名已在应用插件中配置后重试。</td></tr>
|
|
158
|
+
<tr><td><code>301</code></td><td><code>network request cancelled</code></td><td>iOS</td><td>网络请求被取消</td><td>确认应用与网络状态后重试。</td></tr>
|
|
159
|
+
<tr><td><code>302</code></td><td><code>connection timed out</code></td><td>Android、iOS</td><td>网络连接超时</td><td>检查网络连接后重试。</td></tr>
|
|
160
|
+
<tr><td><code>303</code></td><td><code>no network connection</code></td><td>Android、iOS</td><td>当前无可用网络连接</td><td>恢复网络连接后重试。</td></tr>
|
|
161
|
+
<tr><td><code>305</code></td><td><code>network failure</code></td><td>Android、iOS</td><td>发生其他网络错误</td><td>检查网络连接,稍后重试。</td></tr>
|
|
162
|
+
</tbody>
|
|
163
|
+
</table>
|
|
164
|
+
|
|
165
|
+
#### 通用错误码
|
|
166
|
+
|
|
167
|
+
<table>
|
|
168
|
+
<thead>
|
|
169
|
+
<tr><th>errNo</th><th>errMsg</th><th>说明</th><th>平台</th></tr>
|
|
170
|
+
</thead>
|
|
171
|
+
<tbody>
|
|
172
|
+
<tr><td><code>102</code></td><td><code>internal error</code></td><td>内部错误</td><td>iOS</td></tr>
|
|
173
|
+
</tbody>
|
|
174
|
+
</table>
|
|
175
|
+
|
|
176
|
+
## 平台差异
|
|
177
|
+
|
|
178
|
+
- **Android**:网络失败仅细分为 302(HTTP 408 超时)、303(无网络连接)与 305(其他网络错误),不返回 301;url 为空或 method 非法返回 104;命中域名管控返回 110。
|
|
179
|
+
- **iOS**:依据 NSURLError 细分网络失败:请求取消 301、连接超时 302、无网络 303、其他 305;参数或请求体校验失败返回 104;命中域名管控返回 110;其他失败统一返回 102。
|
|
180
|
+
|
|
181
|
+
<a id="connectsocket"></a>
|
|
182
|
+
### connectSocket()
|
|
183
|
+
|
|
184
|
+
# connectSocket
|
|
185
|
+
|
|
186
|
+
创建一个 WebSocket 连接,并返回可操作该连接的 SocketTask。
|
|
187
|
+
|
|
188
|
+
该 API 会同步返回 `SocketTask`,但连接创建本身是异步过程。调用方应先在返回的
|
|
189
|
+
`SocketTask` 上注册事件回调,再等待 `onOpen` 表示连接可用。后续发送消息使用
|
|
190
|
+
`SocketTask.send`,关闭连接使用 `SocketTask.close`。
|
|
191
|
+
|
|
192
|
+
## 扫码预览
|
|
193
|
+

|
|
194
|
+
|
|
195
|
+
## 支持版本
|
|
196
|
+
|
|
197
|
+
前端库版本不低于 `0.0.30`。
|
|
198
|
+
|
|
199
|
+
## 支持平台
|
|
200
|
+
|
|
201
|
+
<table>
|
|
202
|
+
<thead>
|
|
203
|
+
<tr><th>平台</th><th>支持情况</th></tr>
|
|
204
|
+
</thead>
|
|
205
|
+
<tbody>
|
|
206
|
+
<tr><td>Android</td><td>支持</td></tr>
|
|
207
|
+
<tr><td>iOS</td><td>支持</td></tr>
|
|
208
|
+
<tr><td>PC</td><td>不支持</td></tr>
|
|
209
|
+
<tr><td>HarmonyOS</td><td>不支持</td></tr>
|
|
210
|
+
</tbody>
|
|
211
|
+
</table>
|
|
212
|
+
|
|
213
|
+
## 支持场景
|
|
214
|
+
|
|
215
|
+
<table>
|
|
216
|
+
<thead>
|
|
217
|
+
<tr><th>场景</th><th>支持情况</th></tr>
|
|
218
|
+
</thead>
|
|
219
|
+
<tbody>
|
|
220
|
+
<tr><td>页面</td><td>支持</td></tr>
|
|
221
|
+
<tr><td>卡片</td><td>不支持</td></tr>
|
|
222
|
+
</tbody>
|
|
223
|
+
</table>
|
|
224
|
+
|
|
225
|
+
## 使用说明
|
|
226
|
+
|
|
227
|
+
- 返回 `SocketTask` 不代表连接已经成功,连接成功以 `onOpen` 为准。
|
|
228
|
+
- `send` 必须接收对象参数,并把要发送的内容放在 `data` 字段中。
|
|
229
|
+
- 如果 `protocols` 非空,需要服务端支持并返回匹配的子协议。
|
|
230
|
+
- 多次调用会创建多条连接,旧连接不会自动关闭;不再使用时应主动调用 `close`。
|
|
231
|
+
- 连接失败、发送失败或关闭失败会通过 `SocketTask.onError` 通知。
|
|
232
|
+
|
|
233
|
+
- 不再使用的连接应主动调用 SocketTask.close 释放资源,避免占用连接名额。
|
|
234
|
+
|
|
235
|
+
## 调用方式
|
|
236
|
+
|
|
237
|
+
### 同步 API
|
|
238
|
+
|
|
239
|
+
```typescript
|
|
240
|
+
connectSocket(params: ConnectSocketParams): SocketTask
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
## 入参
|
|
244
|
+
|
|
245
|
+
<table>
|
|
246
|
+
<thead>
|
|
247
|
+
<tr><th>名称</th><th>类型</th><th>必填</th><th>默认值</th><th>约束</th><th>说明</th></tr>
|
|
248
|
+
</thead>
|
|
249
|
+
<tbody>
|
|
250
|
+
<tr><td><code>header</code></td><td><code>Record<string, string></code></td><td>否</td><td><code>-</code></td><td>-</td><td>WebSocket 握手阶段携带的 HTTP Header。<br><br>适合放置业务自定义 Header,例如鉴权 token、trace id、客户端能力标识等。<br>`referer` 由豆包客户端统一生成和管理,不应依赖该字段被业务传入值覆盖。</td></tr>
|
|
251
|
+
<tr><td><code>protocols</code></td><td><code>string[]</code></td><td>否</td><td><code>-</code></td><td>-</td><td>WebSocket 子协议数组。<br><br>会作为握手请求中的 `Sec-WebSocket-Protocol` 候选值传给服务端。<br>如果传入非空数组,服务端需要选择其中一个协议并在握手响应中返回;<br>服务端不支持或不返回匹配协议时,豆包客户端可能判定连接创建失败。</td></tr>
|
|
252
|
+
<tr><td><code>url</code></td><td><code>string</code></td><td>是</td><td>-</td><td>-</td><td>WebSocket 连接地址。<br><br>需要包含协议、域名、路径和可选 query,例如 `wss://example.com/socket?room=1`。<br>如果地址为空或不是字符串,本 API 会返回 `readyState` 为 `undefined` 的 SocketTask,<br>并异步触发 `onError`。</td></tr>
|
|
253
|
+
</tbody>
|
|
254
|
+
</table>
|
|
255
|
+
|
|
256
|
+
## 调用示例
|
|
257
|
+
|
|
258
|
+
```typescript
|
|
259
|
+
import { connectSocket } from '@doubao-dev/framework/api';
|
|
260
|
+
|
|
261
|
+
const socketTask = connectSocket({
|
|
262
|
+
url: 'wss://example.com/socket',
|
|
263
|
+
header: { authorization: 'Bearer token' },
|
|
264
|
+
protocols: ['chat.v1']
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
socketTask.onOpen(() => {
|
|
268
|
+
socketTask.send({ data: 'hello' });
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
socketTask.onMessage((event) => {
|
|
272
|
+
console.log(event.data);
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
socketTask.onClose((event) => {
|
|
276
|
+
console.log(event.code, event.reason);
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
socketTask.onError((event) => {
|
|
280
|
+
console.error(event.errMsg);
|
|
281
|
+
});
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
## 返回值
|
|
285
|
+
|
|
286
|
+
<table>
|
|
287
|
+
<thead>
|
|
288
|
+
<tr><th>名称</th><th>类型</th><th>必返</th><th>说明</th></tr>
|
|
289
|
+
</thead>
|
|
290
|
+
<tbody>
|
|
291
|
+
<tr><td><code>close</code></td><td><code>(params?: SocketTaskCloseParams) => void</code></td><td>是</td><td>关闭 WebSocket 连接。<br><br>调用后会发起关闭动作,并把 `readyState` 置为 `SocketTask.CLOSING`。<br>最终关闭完成时触发 `onClose`;关闭动作失败时触发 `onError`。</td></tr>
|
|
292
|
+
<tr><td><code>CLOSED</code></td><td><code>3</code></td><td>是</td><td>表示 Socket 连接已关闭。<br><br>进入该状态后,该任务不会再收到新的消息,也不应继续调用 `send`。</td></tr>
|
|
293
|
+
<tr><td><code>CLOSING</code></td><td><code>2</code></td><td>是</td><td>表示 Socket 连接关闭中。<br><br>调用 SocketTask.close 后,等待豆包客户端完成关闭流程时通常处于该状态。</td></tr>
|
|
294
|
+
<tr><td><code>CONNECTING</code></td><td><code>0</code></td><td>是</td><td>表示 Socket 正在连接。<br><br>`connectSocket` 刚返回且豆包客户端尚未完成握手时通常处于该状态。</td></tr>
|
|
295
|
+
<tr><td><code>onClose</code></td><td><code>(callback: (event: SocketTaskCloseEvent) => void) => void</code></td><td>是</td><td>监听 WebSocket 与服务器连接断开的事件。<br><br>主动关闭、服务端关闭、连接被回收都可能触发该回调。<br>回调触发后当前任务已经结束,不应继续使用。</td></tr>
|
|
296
|
+
<tr><td><code>onError</code></td><td><code>(callback: (event: SocketTaskErrorEvent) => void) => void</code></td><td>是</td><td>监听 WebSocket 发生错误的事件。<br><br>连接创建、发送、关闭或 WebSocket 通道出现异常时触发。<br>该回调只表示发生错误,不等同于连接一定已经关闭;是否关闭应结合 `readyState`<br>或后续 `onClose` 事件判断。</td></tr>
|
|
297
|
+
<tr><td><code>onMessage</code></td><td><code>(callback: (event: SocketTaskMessageEvent) => void) => void</code></td><td>是</td><td>监听 WebSocket 接收到服务器发送信息的事件。<br><br>服务端每下发一条消息都会触发一次回调。消息内容通过 `event.data` 返回,<br>类型可能是 `string` 或 `ArrayBuffer`。</td></tr>
|
|
298
|
+
<tr><td><code>onOpen</code></td><td><code>(callback: (event: SocketTaskOpenEvent) => void) => void</code></td><td>是</td><td>监听 WebSocket 连接服务器成功的事件。<br><br>可以注册多个回调。连接成功后触发回调,并携带握手响应 Header、协议类型等信息。<br>通常应在该回调中或之后调用 `send`。</td></tr>
|
|
299
|
+
<tr><td><code>OPEN</code></td><td><code>1</code></td><td>是</td><td>表示 Socket 连接已经打开。<br><br>进入该状态后可以调用 SocketTask.send 发送数据。</td></tr>
|
|
300
|
+
<tr><td><code>readyState</code></td><td><code>number | undefined</code></td><td>是</td><td>当前 Socket 连接状态 code。<br><br>可与 `CONNECTING`、`OPEN`、`CLOSING`、`CLOSED` 常量比较。<br>如果因为参数错误等原因导致豆包客户端没有成功创建连接,则为 `undefined`。</td></tr>
|
|
301
|
+
<tr><td><code>send</code></td><td><code>(params: SocketTaskSendParams) => void</code></td><td>是</td><td>通过 WebSocket 连接发送数据。<br><br>该方法只发起发送动作,不返回发送结果。建议在 `readyState === SocketTask.OPEN`<br>或收到 `onOpen` 事件后调用;如果连接未就绪、数据编码失败或发送失败,<br>会触发 `onError`。</td></tr>
|
|
302
|
+
</tbody>
|
|
303
|
+
</table>
|
|
304
|
+
|
|
305
|
+
### 返回示例
|
|
306
|
+
|
|
307
|
+
```json
|
|
308
|
+
{
|
|
309
|
+
"readyState": 0
|
|
310
|
+
}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
## 错误处理
|
|
314
|
+
|
|
315
|
+
同步调用失败时抛出错误。错误对象和通用错误码见 [通用错误处理](./common-errors.md#错误返回)。
|
|
316
|
+
|
|
317
|
+
### 失败示例
|
|
318
|
+
|
|
319
|
+
```json
|
|
320
|
+
{
|
|
321
|
+
"errNo": 1501001,
|
|
322
|
+
"errMsg": "websocket connection limit exceeded"
|
|
323
|
+
}
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
### 错误码
|
|
327
|
+
|
|
328
|
+
<table>
|
|
329
|
+
<thead>
|
|
330
|
+
<tr><th>errNo</th><th>errMsg</th><th>平台</th><th>触发条件</th><th>处理建议</th></tr>
|
|
331
|
+
</thead>
|
|
332
|
+
<tbody>
|
|
333
|
+
<tr><td><code>104</code></td><td><code>invalid parameter</code></td><td>Android、iOS</td><td>创建连接时 url 为空或非 ws/wss,或调用 send 时 base64 数据非法、dataType 不支持</td><td>传入合法的 ws/wss url 与受支持的发送数据后重试。</td></tr>
|
|
334
|
+
<tr><td><code>110</code></td><td><code>API call prohibited</code></td><td>Android、iOS</td><td>socket url 未通过域名白名单校验</td><td>确认目标域名已在应用插件中配置后重试。</td></tr>
|
|
335
|
+
<tr><td><code>116</code></td><td><code>resource not found</code></td><td>Android、iOS</td><td>对已关闭或不存在的 socketTaskId 调用 send/close</td><td>仅在 onOpen 后、onClose 前操作连接,不要复用已关闭的连接。</td></tr>
|
|
336
|
+
<tr><td><code>305</code></td><td><code>network failure</code></td><td>Android、iOS</td><td>建立连接、发送或关闭过程中发生网络错误</td><td>检查网络连接,必要时重新建立连接。</td></tr>
|
|
337
|
+
<tr><td><code>1501001</code></td><td><code>websocket connection limit exceeded</code></td><td>Android、iOS</td><td>同一应用插件的 WebSocket 连接数超过上限</td><td>关闭不再使用的连接后重试。</td></tr>
|
|
338
|
+
<tr><td><code>1501002</code></td><td><code>websocket is not open</code></td><td>iOS</td><td>连接尚未打开或已关闭时调用 send</td><td>在收到 onOpen 事件后再发送数据。</td></tr>
|
|
339
|
+
</tbody>
|
|
340
|
+
</table>
|
|
341
|
+
|
|
342
|
+
#### 通用错误码
|
|
343
|
+
|
|
344
|
+
<table>
|
|
345
|
+
<thead>
|
|
346
|
+
<tr><th>errNo</th><th>errMsg</th><th>说明</th><th>平台</th></tr>
|
|
347
|
+
</thead>
|
|
348
|
+
<tbody>
|
|
349
|
+
<tr><td><code>102</code></td><td><code>internal error</code></td><td>内部错误</td><td>Android</td></tr>
|
|
350
|
+
<tr><td><code>113</code></td><td><code>bridge unavailable</code></td><td>JS API 暂不可用</td><td>Android、iOS</td></tr>
|
|
351
|
+
</tbody>
|
|
352
|
+
</table>
|
|
353
|
+
|
|
354
|
+
## 平台差异
|
|
355
|
+
|
|
356
|
+
- **Android**:建立连接失败统一返回 102;send 在连接未打开时返回 305 或 116。
|
|
357
|
+
- **iOS**:send 在连接未打开时返回 1501002。
|
|
358
|
+
|
|
359
|
+
## 已知限制与注意事项
|
|
360
|
+
|
|
361
|
+
- 同一应用插件内最多同时保持 5 条 WebSocket 连接,超过上限时 connectSocket 会立即同步失败并通过 SocketTask.onError 通知。
|
|
362
|
+
|
|
363
|
+
<a id="uploadfile"></a>
|
|
364
|
+
### uploadFile()
|
|
365
|
+
|
|
366
|
+
# uploadFile
|
|
367
|
+
|
|
368
|
+
上传本地文件,并返回可用于监听进度和中断上传的 UploadTask。
|
|
369
|
+
|
|
370
|
+
## 扫码预览
|
|
371
|
+

|
|
372
|
+
|
|
373
|
+
## 支持版本
|
|
374
|
+
|
|
375
|
+
前端库版本不低于 `0.0.39`。
|
|
376
|
+
|
|
377
|
+
## 支持平台
|
|
378
|
+
|
|
379
|
+
<table>
|
|
380
|
+
<thead>
|
|
381
|
+
<tr><th>平台</th><th>支持情况</th></tr>
|
|
382
|
+
</thead>
|
|
383
|
+
<tbody>
|
|
384
|
+
<tr><td>Android</td><td>支持</td></tr>
|
|
385
|
+
<tr><td>iOS</td><td>支持</td></tr>
|
|
386
|
+
<tr><td>PC</td><td>不支持</td></tr>
|
|
387
|
+
<tr><td>HarmonyOS</td><td>不支持</td></tr>
|
|
388
|
+
</tbody>
|
|
389
|
+
</table>
|
|
390
|
+
|
|
391
|
+
## 支持场景
|
|
392
|
+
|
|
393
|
+
<table>
|
|
394
|
+
<thead>
|
|
395
|
+
<tr><th>场景</th><th>支持情况</th></tr>
|
|
396
|
+
</thead>
|
|
397
|
+
<tbody>
|
|
398
|
+
<tr><td>页面</td><td>支持</td></tr>
|
|
399
|
+
<tr><td>卡片</td><td>不支持</td></tr>
|
|
400
|
+
</tbody>
|
|
401
|
+
</table>
|
|
402
|
+
|
|
403
|
+
## 接入准备
|
|
404
|
+
|
|
405
|
+
### 前置条件
|
|
406
|
+
|
|
407
|
+
- url 需命中当前应用插件的上传域名白名单,filePath 需指向当前应用插件可访问的本地文件
|
|
408
|
+
|
|
409
|
+
## 使用说明
|
|
410
|
+
|
|
411
|
+
`uploadFile` 会同步返回可监听、可中断的 Promise 任务对象。
|
|
412
|
+
建议在调用后立即注册进度和响应头监听;不再需要上传时调用 `UploadTask.abort`。
|
|
413
|
+
|
|
414
|
+
- 上传成功时 Promise resolve,上传失败或取消时 Promise reject;任务结束或不再使用时应移除监听,必要时调用 abort。
|
|
415
|
+
|
|
416
|
+
## 调用方式
|
|
417
|
+
|
|
418
|
+
### 异步 API
|
|
419
|
+
|
|
420
|
+
```typescript
|
|
421
|
+
uploadFile(params: UploadFileParams): UploadTask
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
## 入参
|
|
425
|
+
|
|
426
|
+
<table>
|
|
427
|
+
<thead>
|
|
428
|
+
<tr><th>名称</th><th>类型</th><th>必填</th><th>默认值</th><th>约束</th><th>说明</th></tr>
|
|
429
|
+
</thead>
|
|
430
|
+
<tbody>
|
|
431
|
+
<tr><td><code>enableProfile</code></td><td><code>false</code></td><td>否</td><td><code>false</code></td><td>-</td><td>是否返回网络 profile。豆包当前仅支持 false。</td></tr>
|
|
432
|
+
<tr><td><code>filePath</code></td><td><code>string</code></td><td>是</td><td>-</td><td>-</td><td>要上传文件资源的本地路径。</td></tr>
|
|
433
|
+
<tr><td><code>formData</code></td><td><code>Record<string, unknown></code></td><td>否</td><td><code>-</code></td><td>-</td><td>额外的 form-data 字段。对象或数组值会按 JSON 字符串传递。</td></tr>
|
|
434
|
+
<tr><td><code>header</code></td><td><code>Record<string, string></code></td><td>否</td><td><code>-</code></td><td>-</td><td>HTTP 请求 Header。`referer`、`user-agent`、`content-type` 等由豆包客户端管理的字段不会被业务覆盖。</td></tr>
|
|
435
|
+
<tr><td><code>name</code></td><td><code>string</code></td><td>是</td><td>-</td><td>-</td><td>文件对应的 form field name/key,服务端通过该 key 获取文件内容;multipart filename 使用 filePath 的 basename。</td></tr>
|
|
436
|
+
<tr><td><code>timeout</code></td><td><code>number</code></td><td>否</td><td><code>-</code></td><td>-</td><td>超时时间,单位 ms;不传时使用豆包客户端的默认超时配置。</td></tr>
|
|
437
|
+
<tr><td><code>url</code></td><td><code>string</code></td><td>是</td><td>-</td><td>-</td><td>开发者服务器地址,需为完整的 HTTP/HTTPS URL,并通过豆包配置的上传域名白名单校验。</td></tr>
|
|
438
|
+
</tbody>
|
|
439
|
+
</table>
|
|
440
|
+
|
|
441
|
+
## 调用示例
|
|
442
|
+
|
|
443
|
+
```typescript
|
|
444
|
+
import { uploadFile } from '@doubao-dev/framework/api';
|
|
445
|
+
|
|
446
|
+
const task = uploadFile({
|
|
447
|
+
url: 'https://example.com/upload',
|
|
448
|
+
filePath: 'ttfile://temp/example.png',
|
|
449
|
+
name: 'file',
|
|
450
|
+
formData: { scene: 'profile' }
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
task
|
|
454
|
+
.then((result) => {
|
|
455
|
+
console.log(result.statusCode, result.data);
|
|
456
|
+
})
|
|
457
|
+
.catch((error) => {
|
|
458
|
+
console.error(error);
|
|
459
|
+
})
|
|
460
|
+
.finally(() => {
|
|
461
|
+
console.log('upload finished');
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
task.onProgressUpdate((event) => {
|
|
465
|
+
console.log(event.progress, event.totalBytesSent);
|
|
466
|
+
});
|
|
467
|
+
task.onHeadersReceived((event) => {
|
|
468
|
+
console.log(event.header);
|
|
469
|
+
});
|
|
470
|
+
|
|
471
|
+
// 不再需要上传时中断任务。
|
|
472
|
+
// task.abort();
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
## 成功返回
|
|
476
|
+
|
|
477
|
+
<table>
|
|
478
|
+
<thead>
|
|
479
|
+
<tr><th>名称</th><th>类型</th><th>必返</th><th>说明</th></tr>
|
|
480
|
+
</thead>
|
|
481
|
+
<tbody>
|
|
482
|
+
<tr><td><code>data</code></td><td><code>string</code></td><td>否</td><td>服务器返回的数据。</td></tr>
|
|
483
|
+
<tr><td><code>header</code></td><td><code>Record<string, string></code></td><td>是</td><td>HTTP 响应头。</td></tr>
|
|
484
|
+
<tr><td><code>statusCode</code></td><td><code>number</code></td><td>是</td><td>HTTP 状态码。</td></tr>
|
|
485
|
+
</tbody>
|
|
486
|
+
</table>
|
|
487
|
+
|
|
488
|
+
### 返回示例
|
|
489
|
+
|
|
490
|
+
```json
|
|
491
|
+
{
|
|
492
|
+
"statusCode": 200,
|
|
493
|
+
"header": {
|
|
494
|
+
"content-type": "application/json"
|
|
495
|
+
},
|
|
496
|
+
"data": "{\"ok\":true}"
|
|
497
|
+
}
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
## 错误处理
|
|
501
|
+
|
|
502
|
+
错误对象和通用错误码见 [通用错误处理](./common-errors.md#错误返回)。
|
|
503
|
+
|
|
504
|
+
### 失败示例
|
|
505
|
+
|
|
506
|
+
```json
|
|
507
|
+
{
|
|
508
|
+
"errMsg": "uploadFile:fail request time out",
|
|
509
|
+
"errNo": 121920,
|
|
510
|
+
"errorCode": 121920
|
|
511
|
+
}
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
### 错误码
|
|
515
|
+
|
|
516
|
+
<table>
|
|
517
|
+
<thead>
|
|
518
|
+
<tr><th>errNo</th><th>errMsg</th><th>平台</th><th>触发条件</th><th>处理建议</th></tr>
|
|
519
|
+
</thead>
|
|
520
|
+
<tbody>
|
|
521
|
+
<tr><td><code>121999</code></td><td><code>uploadFile:fail url is invalid</code></td><td>Android、iOS</td><td>url 缺失或不是有效上传地址</td><td>传入完整的 HTTP/HTTPS URL</td></tr>
|
|
522
|
+
<tr><td><code>121999</code></td><td><code>uploadFile:fail name is required</code></td><td>Android、iOS</td><td>name 缺失或为空</td><td>传入服务端接收文件所使用的 form field name</td></tr>
|
|
523
|
+
<tr><td><code>121901</code></td><td><code>uploadFile:fail url not in domain list</code></td><td>Android、iOS</td><td>url 未命中上传域名白名单</td><td>在应用插件配置中添加上传域名后重试</td></tr>
|
|
524
|
+
<tr><td><code>121902</code></td><td><code>uploadFile:fail no file exist</code></td><td>Android、iOS</td><td>filePath 为空、文件不存在或路径不是文件</td><td>使用文件 API 获取当前应用插件可访问的有效文件路径</td></tr>
|
|
525
|
+
<tr><td><code>121905</code></td><td><code>uploadFile:fail upload file abort</code></td><td>Android、iOS</td><td>调用 UploadTask.abort 中断上传</td><td>按业务需要处理取消状态,无需自动重试</td></tr>
|
|
526
|
+
<tr><td><code>121906</code></td><td><code>uploadFile:fail file path permission denied</code></td><td>Android、iOS</td><td>当前应用插件无权访问 filePath</td><td>改用当前应用插件目录内的文件</td></tr>
|
|
527
|
+
<tr><td><code>121920</code></td><td><code>uploadFile:fail request time out</code></td><td>Android、iOS</td><td>上传超过豆包客户端的超时时间</td><td>检查网络或设置合理的 timeout 后重试</td></tr>
|
|
528
|
+
<tr><td><code>121985</code></td><td><code>uploadFile:fail network unavailable</code></td><td>Android、iOS</td><td>当前网络不可用</td><td>恢复网络连接后重试</td></tr>
|
|
529
|
+
<tr><td><code>121991</code></td><td><code>uploadFile:fail network error</code></td><td>Android、iOS</td><td>上传过程中发生网络错误</td><td>检查网络和服务端状态后重试</td></tr>
|
|
530
|
+
<tr><td><code>121992</code></td><td><code>uploadFile:fail enableProfile is not supported</code></td><td>Android、iOS</td><td>enableProfile 设置为 true</td><td>移除 enableProfile 或设置为 false</td></tr>
|
|
531
|
+
</tbody>
|
|
532
|
+
</table>
|
|
533
|
+
|
|
534
|
+
<a id="downloadfile"></a>
|
|
535
|
+
### downloadFile()
|
|
536
|
+
|
|
537
|
+
# downloadFile
|
|
538
|
+
|
|
539
|
+
下载文件,并返回可取消、可监听进度的 DownloadTask。
|
|
540
|
+
|
|
541
|
+
## 扫码预览
|
|
542
|
+

|
|
543
|
+
|
|
544
|
+
## 支持版本
|
|
545
|
+
|
|
546
|
+
前端库版本不低于 `0.0.40`。
|
|
547
|
+
|
|
548
|
+
## 支持平台
|
|
549
|
+
|
|
550
|
+
<table>
|
|
551
|
+
<thead>
|
|
552
|
+
<tr><th>平台</th><th>支持情况</th></tr>
|
|
553
|
+
</thead>
|
|
554
|
+
<tbody>
|
|
555
|
+
<tr><td>Android</td><td>支持</td></tr>
|
|
556
|
+
<tr><td>iOS</td><td>支持</td></tr>
|
|
557
|
+
<tr><td>PC</td><td>不支持</td></tr>
|
|
558
|
+
<tr><td>HarmonyOS</td><td>不支持</td></tr>
|
|
559
|
+
</tbody>
|
|
560
|
+
</table>
|
|
561
|
+
|
|
562
|
+
## 支持场景
|
|
563
|
+
|
|
564
|
+
<table>
|
|
565
|
+
<thead>
|
|
566
|
+
<tr><th>场景</th><th>支持情况</th></tr>
|
|
567
|
+
</thead>
|
|
568
|
+
<tbody>
|
|
569
|
+
<tr><td>页面</td><td>支持</td></tr>
|
|
570
|
+
<tr><td>卡片</td><td>不支持</td></tr>
|
|
571
|
+
</tbody>
|
|
572
|
+
</table>
|
|
573
|
+
|
|
574
|
+
## 接入准备
|
|
575
|
+
|
|
576
|
+
### 前置条件
|
|
577
|
+
|
|
578
|
+
- 下载地址需通过豆包配置的下载域名白名单校验,单个文件不得超过 200 MB,单个应用插件同时最多执行 10 个下载任务;指定 filePath 时仅支持临时目录或用户目录
|
|
579
|
+
|
|
580
|
+
## 使用说明
|
|
581
|
+
|
|
582
|
+
- 下载使用 GET 请求。
|
|
583
|
+
- HTTP 传输完成且文件写入成功后,无论 statusCode 是 2xx、4xx 还是 5xx,Promise 都会 resolve。
|
|
584
|
+
- 域名校验失败、路径非法、超时、取消、网络异常、写入失败会使 Promise reject。
|
|
585
|
+
|
|
586
|
+
- 未指定 filePath 时文件写入临时目录,并通过 Promise resolve 结果的 tempFilePath 返回;临时文件的生命周期由豆包客户端管理。
|
|
587
|
+
- 不跟随 HTTP 重定向,3xx 响应使 Promise reject;4xx、5xx 响应在文件写入成功后仍使 Promise resolve。
|
|
588
|
+
|
|
589
|
+
## 调用方式
|
|
590
|
+
|
|
591
|
+
### 异步 API
|
|
592
|
+
|
|
593
|
+
```typescript
|
|
594
|
+
downloadFile(params: DownloadFileParams): DownloadTask
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
## 入参
|
|
598
|
+
|
|
599
|
+
<table>
|
|
600
|
+
<thead>
|
|
601
|
+
<tr><th>名称</th><th>类型</th><th>必填</th><th>默认值</th><th>约束</th><th>说明</th></tr>
|
|
602
|
+
</thead>
|
|
603
|
+
<tbody>
|
|
604
|
+
<tr><td><code>filePath</code></td><td><code>string</code></td><td>否</td><td><code>由系统创建临时下载文件</code></td><td>-</td><td>目标文件路径,仅支持 `appletfile://temp/...` 或 `appletfile://user/...`。</td></tr>
|
|
605
|
+
<tr><td><code>header</code></td><td><code>Record<string, string></code></td><td>否</td><td><code>-</code></td><td>-</td><td>请求 Header。`referer` 和 `user-agent` 由豆包客户端管理,业务传入值不会透传。</td></tr>
|
|
606
|
+
<tr><td><code>timeout</code></td><td><code>number</code></td><td>否</td><td><code>60000</code></td><td>有效范围为 1-300000</td><td>下载任务超时时间,单位 ms;不传或传入非正数时使用 60000,超过 300000 时按 300000 处理。</td></tr>
|
|
607
|
+
<tr><td><code>url</code></td><td><code>string</code></td><td>是</td><td>-</td><td>-</td><td>下载资源地址,需为完整 HTTPS URL,并通过豆包配置的下载域名白名单校验。</td></tr>
|
|
608
|
+
</tbody>
|
|
609
|
+
</table>
|
|
610
|
+
|
|
611
|
+
## 调用示例
|
|
612
|
+
|
|
613
|
+
```typescript
|
|
614
|
+
import { downloadFile } from '@doubao-dev/framework/api';
|
|
615
|
+
|
|
616
|
+
const downloadTask = downloadFile({
|
|
617
|
+
url: 'https://example.com/files/report.pdf'
|
|
618
|
+
});
|
|
619
|
+
|
|
620
|
+
downloadTask
|
|
621
|
+
.then((result) => {
|
|
622
|
+
console.log(result.statusCode, result.tempFilePath ?? result.filePath);
|
|
623
|
+
})
|
|
624
|
+
.catch((error) => {
|
|
625
|
+
console.error(error);
|
|
626
|
+
})
|
|
627
|
+
.finally(() => {
|
|
628
|
+
console.log('download finished');
|
|
629
|
+
});
|
|
630
|
+
|
|
631
|
+
downloadTask.onProgressUpdate((event) => {
|
|
632
|
+
console.log(`downloaded ${event.progress}%`);
|
|
633
|
+
});
|
|
634
|
+
|
|
635
|
+
downloadTask.onHeadersReceived((event) => {
|
|
636
|
+
console.log(event.header);
|
|
637
|
+
});
|
|
638
|
+
```
|
|
639
|
+
|
|
640
|
+
## 成功返回
|
|
641
|
+
|
|
642
|
+
<table>
|
|
643
|
+
<thead>
|
|
644
|
+
<tr><th>名称</th><th>类型</th><th>必返</th><th>说明</th></tr>
|
|
645
|
+
</thead>
|
|
646
|
+
<tbody>
|
|
647
|
+
<tr><td><code>filePath</code></td><td><code>string</code></td><td>否</td><td>指定 `filePath` 时返回的目标文件路径。</td></tr>
|
|
648
|
+
<tr><td><code>header</code></td><td><code>Record<string, string></code></td><td>是</td><td>HTTP 响应头。</td></tr>
|
|
649
|
+
<tr><td><code>statusCode</code></td><td><code>number</code></td><td>是</td><td>HTTP 状态码。非 2xx 响应也会在下载写入成功后返回。</td></tr>
|
|
650
|
+
<tr><td><code>tempFilePath</code></td><td><code>string</code></td><td>否</td><td>未指定 `filePath` 时返回的临时文件路径。</td></tr>
|
|
651
|
+
</tbody>
|
|
652
|
+
</table>
|
|
653
|
+
|
|
654
|
+
### 返回示例
|
|
655
|
+
|
|
656
|
+
```json
|
|
657
|
+
{
|
|
658
|
+
"statusCode": 200,
|
|
659
|
+
"header": {
|
|
660
|
+
"content-type": "application/pdf"
|
|
661
|
+
},
|
|
662
|
+
"tempFilePath": "appletfile://temp/report.pdf"
|
|
663
|
+
}
|
|
664
|
+
```
|
|
665
|
+
|
|
666
|
+
## 相关类型
|
|
667
|
+
|
|
668
|
+
<a id="requestmethod"></a>
|
|
669
|
+
### RequestMethod
|
|
670
|
+
|
|
671
|
+
#### Type
|
|
672
|
+
|
|
673
|
+
`'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD' | 'OPTIONS' | 'TRACE' | 'CONNECT'`
|
|
674
|
+
|
|
675
|
+
<a id="requestparams"></a>
|
|
676
|
+
### RequestParams
|
|
677
|
+
|
|
678
|
+
网络请求参数。
|
|
679
|
+
|
|
680
|
+
#### Properties
|
|
681
|
+
|
|
682
|
+
• **url**: `string` - 请求地址,需为完整的 HTTP 或 HTTPS URL
|
|
683
|
+
• **header?**: `Record<string, string>` - 请求 Header
|
|
684
|
+
• **method?**: `RequestMethod` - 请求方法
|
|
685
|
+
• **data?**: `Record<string, any> | string | ArrayBuffer` - 请求体数据。 传给服务器的数据最终会是 String 或 ArrayBuffer: - 若 data 是 string 或 ArrayBuffer,直接使用; - 若 header['content-type'] 是 application/x-www-form-urlencoded,会被编码为 query string,例如:encodeURIComponent(k)=encodeURIComponent(v); - 若 header['content-type'] 是 application/json,会执行 JSON 序列化; - 若 data 是普通对象且未命中上述类型,也会执行 JSON 序列化; - 其他类型会调用 toString()
|
|
686
|
+
• **dataType?**: `'json' | 'string' | 'arraybuffer'` - 期望返回的数据格式。 - json:尝试按 JSON 解析; - string:按字符串返回。 - arraybuffer:按二进制数据返回
|
|
687
|
+
|
|
688
|
+
<a id="requestresponse"></a>
|
|
689
|
+
### RequestResponse
|
|
690
|
+
|
|
691
|
+
网络请求返回结果。
|
|
692
|
+
|
|
693
|
+
#### Properties
|
|
694
|
+
|
|
695
|
+
• **statusCode**: `number` - HTTP 状态码
|
|
696
|
+
• **header**: `Record<string, string>` - HTTP 响应头
|
|
697
|
+
• **data?**: `string | ArrayBuffer | Record<string, any>` - 响应数据,类型由 dataType 决定
|
|
698
|
+
|
|
699
|
+
<a id="connectsocketparams"></a>
|
|
700
|
+
### ConnectSocketParams
|
|
701
|
+
|
|
702
|
+
创建 WebSocket 连接的参数。 connectSocket 会把这些参数交给豆包客户端创建连接。连接创建请求发出后, 调用方会立即拿到一个 SocketTask,后续连接成功、失败、收到消息和关闭状态 都通过 SocketTask 上注册的事件回调通知。
|
|
703
|
+
|
|
704
|
+
#### Properties
|
|
705
|
+
|
|
706
|
+
• **url**: `string` - WebSocket 连接地址。 需要包含协议、域名、路径和可选 query,例如 wss://example.com/socket?room=1。 如果地址为空或不是字符串,本 API 会返回 readyState 为 undefined 的 SocketTask, 并异步触发 onError
|
|
707
|
+
• **header?**: `Record<string, string>` - WebSocket 握手阶段携带的 HTTP Header。 适合放置业务自定义 Header,例如鉴权 token、trace id、客户端能力标识等。 referer 由豆包客户端统一生成和管理,不应依赖该字段被业务传入值覆盖
|
|
708
|
+
• **protocols?**: `string[]` - WebSocket 子协议数组。 会作为握手请求中的 Sec-WebSocket-Protocol 候选值传给服务端。 如果传入非空数组,服务端需要选择其中一个协议并在握手响应中返回; 服务端不支持或不返回匹配协议时,豆包客户端可能判定连接创建失败
|
|
709
|
+
|
|
710
|
+
<a id="sockettasksendparams"></a>
|
|
711
|
+
### SocketTaskSendParams
|
|
712
|
+
|
|
713
|
+
SocketTask.send 的参数。 send 只负责向已打开的 WebSocket 连接写入一条消息,不返回 Promise。 发送失败、连接未就绪或 WebSocket 通道异常时,会通过同一个 SocketTask 的 onError 回调通知。
|
|
714
|
+
|
|
715
|
+
#### Properties
|
|
716
|
+
|
|
717
|
+
• **data**: `string | ArrayBuffer` - 需要发送给服务端的数据。 - 传入 string 时按文本消息发送; - 传入 ArrayBuffer 时按二进制消息发送。 建议只在 onOpen 回调触发后调用 send,此时 readyState 通常为 SocketTask.OPEN
|
|
718
|
+
|
|
719
|
+
<a id="sockettaskcloseparams"></a>
|
|
720
|
+
### SocketTaskCloseParams
|
|
721
|
+
|
|
722
|
+
SocketTask.close 的参数。 close 用于主动关闭当前 WebSocket 连接。调用后 readyState 会先进入 SocketTask.CLOSING,最终关闭结果通过 onClose 或 onError 回调通知。
|
|
723
|
+
|
|
724
|
+
#### Properties
|
|
725
|
+
|
|
726
|
+
• **code?**: `number` - 关闭连接状态码。 不传时由豆包客户端按正常关闭处理,通常等价于 1000。 常见值包括: - 1000: 正常关闭; - 1001: 因页面进入后台、豆包客户端回收连接等原因关闭
|
|
727
|
+
• **reason?**: `string` - 连接被关闭的原因。 该字段会随关闭帧传递给服务端,是否被服务端记录或回传取决于服务端实现
|
|
728
|
+
|
|
729
|
+
<a id="sockettaskopenevent"></a>
|
|
730
|
+
### SocketTaskOpenEvent
|
|
731
|
+
|
|
732
|
+
WebSocket 连接成功事件。 当豆包客户端完成 WebSocket 握手并进入 open 状态后触发。 收到该事件后,调用方可以开始通过 SocketTask.send 发送数据。
|
|
733
|
+
|
|
734
|
+
#### Properties
|
|
735
|
+
|
|
736
|
+
• **header**: `Record<string, string>` - WebSocket 握手响应中的 Response Header。 豆包 Android、iOS 当前不会透出真实握手响应头,该字段固定返回空对象 {}, 请不要依赖它读取服务端返回的握手 Header
|
|
737
|
+
• **protocolType?**: `string` - 当前连接使用的网络传输层协议。 豆包无法获取时不返回该字段
|
|
738
|
+
• **socketType?**: `string` - 当前连接使用的 WebSocket 组件类型。 具体值因客户端平台而异;豆包无法获取时不返回该字段
|
|
739
|
+
|
|
740
|
+
<a id="sockettaskmessageevent"></a>
|
|
741
|
+
### SocketTaskMessageEvent
|
|
742
|
+
|
|
743
|
+
WebSocket 收到服务端消息事件。 服务端通过当前连接下发消息时触发。文本消息会以 string 形式返回; 二进制消息会尽量还原为 ArrayBuffer。
|
|
744
|
+
|
|
745
|
+
#### Properties
|
|
746
|
+
|
|
747
|
+
• **data**: `string | ArrayBuffer` - 收到的服务端消息。 - 文本消息返回 string; - 二进制消息返回 ArrayBuffer。 豆包无法将二进制消息转换为 ArrayBuffer 时,内容会保持字符串形式
|
|
748
|
+
• **protocolType?**: `string` - 当前消息所属连接使用的协议。 豆包无法获取时不返回该字段
|
|
749
|
+
• **socketType?**: `string` - 当前连接使用的 WebSocket 组件类型。 具体值因客户端平台而异;豆包无法获取时不返回该字段
|
|
750
|
+
|
|
751
|
+
<a id="sockettaskcloseevent"></a>
|
|
752
|
+
### SocketTaskCloseEvent
|
|
753
|
+
|
|
754
|
+
WebSocket 关闭事件。 当前连接被主动关闭、服务端关闭或豆包客户端因异常回收连接时触发。 触发后 readyState 会变为 SocketTask.CLOSED,该 SocketTask 不应再继续发送数据。
|
|
755
|
+
|
|
756
|
+
#### Properties
|
|
757
|
+
|
|
758
|
+
• **code?**: `number` - 关闭状态码。 可能来自调用 SocketTask.close 时传入的 code,也可能来自服务端或豆包客户端
|
|
759
|
+
• **reason?**: `string` - 关闭原因。 可能来自调用 SocketTask.close 时传入的 reason,也可能来自服务端或豆包客户端
|
|
760
|
+
• **errMsg?**: `string` - 错误信息。 非正常关闭时豆包客户端可能通过该字段补充失败原因;正常关闭时通常为空
|
|
761
|
+
• **protocolType?**: `string` - 当前连接使用的网络传输层协议。 豆包无法获取时不返回该字段
|
|
762
|
+
• **socketType?**: `string` - 当前连接使用的 WebSocket 组件类型。 具体值因客户端平台而异;豆包无法获取时不返回该字段
|
|
763
|
+
|
|
764
|
+
<a id="sockettaskerrorevent"></a>
|
|
765
|
+
### SocketTaskErrorEvent
|
|
766
|
+
|
|
767
|
+
WebSocket 错误事件。 连接创建失败、发送失败、主动关闭失败、WebSocket 通道异常等错误都会通过该事件通知。 如果错误发生在连接创建阶段,readyState 会变为 undefined 或 SocketTask.CLOSED。
|
|
768
|
+
|
|
769
|
+
#### Properties
|
|
770
|
+
|
|
771
|
+
• **errMsg**: `string` - 错误信息。 描述参数校验、数据编码或 WebSocket 操作的失败原因,可直接用于日志上报
|
|
772
|
+
|
|
773
|
+
<a id="sockettask"></a>
|
|
774
|
+
### SocketTask
|
|
775
|
+
|
|
776
|
+
通过 connectSocket 获取的 WebSocket 任务实例。 SocketTask 表示单条 WebSocket 连接的控制对象。它负责发送数据、关闭连接, 并通过事件回调接收连接状态、服务端消息和错误通知。connectSocket 返回时连接 仍可能处于创建中,调用方应先注册 onOpen、onError、onClose、onMessage 等回调,再根据 onOpen 事件发送业务数据。
|
|
777
|
+
|
|
778
|
+
#### Properties
|
|
779
|
+
|
|
780
|
+
• **CONNECTING**: `0` - 表示 Socket 正在连接。 connectSocket 刚返回且豆包客户端尚未完成握手时通常处于该状态
|
|
781
|
+
• **OPEN**: `1` - 表示 Socket 连接已经打开。 进入该状态后可以调用 SocketTask.send 发送数据
|
|
782
|
+
• **CLOSING**: `2` - 表示 Socket 连接关闭中。 调用 SocketTask.close 后,等待豆包客户端完成关闭流程时通常处于该状态
|
|
783
|
+
• **CLOSED**: `3` - 表示 Socket 连接已关闭。 进入该状态后,该任务不会再收到新的消息,也不应继续调用 send
|
|
784
|
+
• **readyState**: `number | undefined` - 当前 Socket 连接状态 code。 可与 CONNECTING、OPEN、CLOSING、CLOSED 常量比较。 如果因为参数错误等原因导致豆包客户端没有成功创建连接,则为 undefined
|
|
785
|
+
• **send**: `(params: SocketTaskSendParams) => void` - 通过 WebSocket 连接发送数据。 该方法只发起发送动作,不返回发送结果。建议在 readyState === SocketTask.OPEN 或收到 onOpen 事件后调用;如果连接未就绪、数据编码失败或发送失败, 会触发 onError
|
|
786
|
+
• **close**: `(params?: SocketTaskCloseParams) => void` - 关闭 WebSocket 连接。 调用后会发起关闭动作,并把 readyState 置为 SocketTask.CLOSING。 最终关闭完成时触发 onClose;关闭动作失败时触发 onError
|
|
787
|
+
• **onOpen**: `(callback: (event: SocketTaskOpenEvent) => void) => void` - 监听 WebSocket 连接服务器成功的事件。 可以注册多个回调。连接成功后触发回调,并携带握手响应 Header、协议类型等信息。 通常应在该回调中或之后调用 send
|
|
788
|
+
• **onClose**: `(callback: (event: SocketTaskCloseEvent) => void) => void` - 监听 WebSocket 与服务器连接断开的事件。 主动关闭、服务端关闭、连接被回收都可能触发该回调。 回调触发后当前任务已经结束,不应继续使用
|
|
789
|
+
• **onMessage**: `(callback: (event: SocketTaskMessageEvent) => void) => void` - 监听 WebSocket 接收到服务器发送信息的事件。 服务端每下发一条消息都会触发一次回调。消息内容通过 event.data 返回, 类型可能是 string 或 ArrayBuffer
|
|
790
|
+
• **onError**: `(callback: (event: SocketTaskErrorEvent) => void) => void` - 监听 WebSocket 发生错误的事件。 连接创建、发送、关闭或 WebSocket 通道出现异常时触发。 该回调只表示发生错误,不等同于连接一定已经关闭;是否关闭应结合 readyState 或后续 onClose 事件判断
|
|
791
|
+
|
|
792
|
+
<a id="uploadfileresult"></a>
|
|
793
|
+
### UploadFileResult
|
|
794
|
+
|
|
795
|
+
文件上传结果。
|
|
796
|
+
|
|
797
|
+
#### Properties
|
|
798
|
+
|
|
799
|
+
• **statusCode**: `number` - HTTP 状态码
|
|
800
|
+
• **header**: `Record<string, string>` - HTTP 响应头
|
|
801
|
+
• **data?**: `string` - 服务器返回的数据
|
|
802
|
+
|
|
803
|
+
<a id="uploadfileparams"></a>
|
|
804
|
+
### UploadFileParams
|
|
805
|
+
|
|
806
|
+
文件上传参数。
|
|
807
|
+
|
|
808
|
+
#### Properties
|
|
809
|
+
|
|
810
|
+
• **url**: `string` - 开发者服务器地址,需为完整的 HTTP/HTTPS URL,并通过豆包配置的上传域名白名单校验
|
|
811
|
+
• **filePath**: `string` - 要上传文件资源的本地路径
|
|
812
|
+
• **name**: `string` - 文件对应的 form field name/key,服务端通过该 key 获取文件内容;multipart filename 使用 filePath 的 basename
|
|
813
|
+
• **header?**: `Record<string, string>` - HTTP 请求 Header。referer、user-agent、content-type 等由豆包客户端管理的字段不会被业务覆盖
|
|
814
|
+
• **formData?**: `Record<string, unknown>` - 额外的 form-data 字段。对象或数组值会按 JSON 字符串传递
|
|
815
|
+
• **timeout?**: `number` - 超时时间,单位 ms;不传时使用豆包客户端的默认超时配置
|
|
816
|
+
• **enableProfile?**: `false` - 是否返回网络 profile。豆包当前仅支持 false
|
|
817
|
+
|
|
818
|
+
<a id="uploadtask"></a>
|
|
819
|
+
### UploadTask
|
|
820
|
+
|
|
821
|
+
通过 uploadFile 获取的文件上传任务实例。
|
|
822
|
+
|
|
823
|
+
#### Properties
|
|
824
|
+
|
|
825
|
+
• **abort**: `() => void` - 中断当前上传任务。 中断成功后上传 Promise 会 reject;任务已经结束时调用无副作用
|
|
826
|
+
• **onProgressUpdate**: `(callback: (event: UploadTaskProgressUpdateEvent) => void) => void` - 监听上传进度变化。 同一个任务可以注册多个回调,每次收到豆包客户端的进度事件时依次调用
|
|
827
|
+
• **offProgressUpdate**: `(callback?: (event: UploadTaskProgressUpdateEvent) => void) => void` - 取消监听上传进度变化。 传入 callback 时只移除该回调;不传 callback 时移除当前任务的全部进度监听
|
|
828
|
+
• **onHeadersReceived**: `(callback: (event: UploadTaskHeadersReceivedEvent) => void) => void` - 监听 HTTP Response Header 事件。 同一个任务可以注册多个回调,豆包客户端收到上传响应头时依次调用
|
|
829
|
+
• **offHeadersReceived**: `(callback?: (event: UploadTaskHeadersReceivedEvent) => void) => void` - 取消监听 HTTP Response Header 事件。 传入 callback 时只移除该回调;不传 callback 时移除当前任务的全部 Header 监听
|
|
830
|
+
|
|
831
|
+
<a id="uploadtaskprogressupdateevent"></a>
|
|
832
|
+
### UploadTaskProgressUpdateEvent
|
|
833
|
+
|
|
834
|
+
文件上传进度事件。
|
|
835
|
+
|
|
836
|
+
#### Properties
|
|
837
|
+
|
|
838
|
+
• **progress**: `number` - 上传进度百分比,范围 0 - 100
|
|
839
|
+
• **totalBytesSent**: `number` - 已经上传的数据长度,单位 B
|
|
840
|
+
• **totalBytesExpectedToSend**: `number` - 预期需要上传的数据总长度,单位 B
|
|
841
|
+
|
|
842
|
+
<a id="uploadtaskheadersreceivedevent"></a>
|
|
843
|
+
### UploadTaskHeadersReceivedEvent
|
|
844
|
+
|
|
845
|
+
文件上传响应头事件。
|
|
846
|
+
|
|
847
|
+
#### Properties
|
|
848
|
+
|
|
849
|
+
• **header**: `Record<string, string>` - HTTP 响应头
|
|
850
|
+
|
|
851
|
+
<a id="downloadfileresult"></a>
|
|
852
|
+
### DownloadFileResult
|
|
853
|
+
|
|
854
|
+
#### Properties
|
|
855
|
+
|
|
856
|
+
• **statusCode**: `number` - HTTP 状态码。非 2xx 响应也会在下载写入成功后返回
|
|
857
|
+
• **header**: `Record<string, string>` - HTTP 响应头
|
|
858
|
+
• **tempFilePath?**: `string` - 未指定 filePath 时返回的临时文件路径
|
|
859
|
+
• **filePath?**: `string` - 指定 filePath 时返回的目标文件路径
|
|
860
|
+
|
|
861
|
+
<a id="downloadfileparams"></a>
|
|
862
|
+
### DownloadFileParams
|
|
863
|
+
|
|
864
|
+
下载文件参数。
|
|
865
|
+
|
|
866
|
+
#### Properties
|
|
867
|
+
|
|
868
|
+
• **url**: `string` - 下载资源地址,需为完整 HTTPS URL,并通过豆包配置的下载域名白名单校验
|
|
869
|
+
• **header?**: `Record<string, string>` - 请求 Header。referer 和 user-agent 由豆包客户端管理,业务传入值不会透传
|
|
870
|
+
• **timeout?**: `number` - 下载任务超时时间,单位 ms;不传或传入非正数时使用 60000,超过 300000 时按 300000 处理
|
|
871
|
+
• **filePath?**: `string` - 目标文件路径,仅支持 appletfile://temp/... 或 appletfile://user/...
|
|
872
|
+
|
|
873
|
+
<a id="downloadtask"></a>
|
|
874
|
+
### DownloadTask
|
|
875
|
+
|
|
876
|
+
下载任务。
|
|
877
|
+
|
|
878
|
+
#### Properties
|
|
879
|
+
|
|
880
|
+
• **abort**: `() => void` - 取消下载任务。 任务完成后调用不会产生额外效果;取消成功后下载 Promise 会 reject
|
|
881
|
+
• **onProgressUpdate**: `(callback: (event: DownloadFileProgressUpdate) => void) => void` - 监听下载进度变化。 同一个回调只会注册一次,可以注册多个不同回调
|
|
882
|
+
• **offProgressUpdate**: `(callback?: (event: DownloadFileProgressUpdate) => void) => void` - 取消监听下载进度变化。 传入 callback 时仅移除该回调;不传 callback 时移除当前任务的全部进度监听
|
|
883
|
+
• **onHeadersReceived**: `(callback: (event: DownloadTaskHeadersReceivedEvent) => void) => void` - 监听 HTTP Response Header 事件。 同一个回调只会注册一次,可以注册多个不同回调
|
|
884
|
+
• **offHeadersReceived**: `(callback?: (event: DownloadTaskHeadersReceivedEvent) => void) => void` - 取消监听 HTTP Response Header 事件。 传入 callback 时仅移除该回调;不传 callback 时移除当前任务的全部 Header 监听
|
|
885
|
+
|
|
886
|
+
<a id="downloadfileprogressupdate"></a>
|
|
887
|
+
### DownloadFileProgressUpdate
|
|
888
|
+
|
|
889
|
+
#### Properties
|
|
890
|
+
|
|
891
|
+
• **progress**: `number` - 下载进度百分比,范围 0-100
|
|
892
|
+
• **totalBytesWritten**: `number` - 已经下载的数据长度,单位 Bytes
|
|
893
|
+
• **totalBytesExpectedToWrite**: `number` - 预期需要下载的数据总长度,未知时可能为 -1
|
|
894
|
+
|
|
895
|
+
<a id="downloadtaskheadersreceivedevent"></a>
|
|
896
|
+
### DownloadTaskHeadersReceivedEvent
|
|
897
|
+
|
|
898
|
+
#### Properties
|
|
899
|
+
|
|
900
|
+
• **header**: `Record<string, string>` - HTTP 响应头
|