@microi.net/cli 4.9.6 → 4.9.7
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/.codebuddy-plugin/marketplace.json +2 -2
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.workbuddy-plugin/marketplace.json +2 -2
- package/.workbuddy-plugin/plugin.json +1 -1
- package/assets/build-meta.json +6 -5
- package/package.json +1 -1
- package/scripts/mcp-server.js +83 -83
- package/scripts/microi-cli.js +55 -85
- package/scripts/microi-codex-broker.js +418 -0
- package/scripts/microi-codex-router.js +129 -65
- package/scripts/microi-skills.meta.json +310 -151
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +3566 -0
- package/skills/ai-platform-governance/SKILL.md +21 -166
- package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -0
- package/skills/microi-client-frontend/SKILL.md +17 -434
- package/skills/microi-client-frontend/references/progressive-01-3-/345/212/250/346/200/201/346/214/211/351/222/256/347/263/273/347/273/237.md +144 -0
- package/skills/microi-client-frontend/references/progressive-02-8-/350/277/220/350/241/214/346/227/266/351/253/230/351/242/221/345/235/221/345/244/215/347/233/230.md +178 -0
- package/skills/microi-client-frontend/references/progressive-03-vue3-/345/211/215/347/253/257/345/276/256/346/234/215/345/212/241/345/256/277/344/270/273/350/247/204/345/210/231.md +144 -0
- package/skills/microi-db-schema/SKILL.md +3 -3
- package/skills/microi-db-schema/references/schema-overview.md +1 -1
- package/skills/microi-db-schema/references/schema.md +1 -1
- package/skills/microi-db-schema/references/table-catalog.md +1 -1
- package/skills/microi-form-engine/SKILL.md +1 -1
- package/skills/microi-form-layout/SKILL.md +19 -225
- package/skills/microi-form-layout/references/progressive-01-3-/344/270/211/347/247/215/345/210/206/347/273/204/347/232/204/345/255/230/345/202/250/344/270/216/351/205/215/347/275/256.md +235 -0
- package/skills/microi-frontend-sdk/SKILL.md +17 -151
- package/skills/microi-frontend-sdk/references/progressive-01-token-/345/275/223/345/211/215/347/231/273/345/275/225/347/224/250/346/210/267/344/270/216/345/275/223/345/211/215/347/273/210/347/253/257/347/231/273/345/275/225/345/215/217/350/256/256.md +171 -0
- package/skills/microi-mobile-app-quality/SKILL.md +22 -288
- package/skills/microi-mobile-app-quality/references/progressive-01-4-/351/207/215/350/246/201/346/214/211/351/222/256/345/277/205/351/241/273/345/270/246/345/233/276/346/240/207.md +209 -0
- package/skills/microi-mobile-app-quality/references/progressive-02-9-/344/270/273/351/242/230/345/210/207/346/215/242/345/277/205/351/241/273/347/234/237/345/256/236/344/270/224/345/205/250/345/261/200/347/224/237/346/225/210.md +117 -0
- package/skills/microi-system-delivery/SKILL.md +16 -380
- package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +186 -0
- package/skills/microi-system-delivery/references/progressive-02-/350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/345/277/205/351/241/273/350/246/206/347/233/226/347/232/204/345/235/221.md +210 -0
- package/skills/microi-ui/SKILL.md +19 -169
- package/skills/microi-ui/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/234/272/346/231/257/350/223/235/345/233/276.md +183 -0
- package/skills/microi-uniapp-frontend/SKILL.md +26 -335
- package/skills/microi-uniapp-frontend/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/210/206/347/261/273-/345/217/214/346/240/217/345/210/227/350/241/250/347/213/254/347/253/213/346/273/232/345/212/250.md +225 -0
- package/skills/microi-uniapp-frontend/references/progressive-02-/345/205/263/351/224/256/344/270/232/345/212/241/350/265/204/344/272/247/344/270/215/345/276/227/351/273/230/350/256/244/351/200/211/344/270/255.md +154 -0
- package/skills/page-engine/SKILL.md +23 -271
- package/skills/page-engine/references/progressive-01-/346/211/200/346/234/211/347/273/204/344/273/266/347/261/273/345/236/213.md +234 -0
- package/skills/page-engine/references/progressive-02-/347/211/210/346/234/254/345/216/206/345/217/262-/345/271/266/345/217/221/344/277/235/345/255/230/344/270/216/345/233/236/346/273/232.md +60 -0
- package/skills/playwright-e2e/SKILL.md +24 -590
- package/skills/playwright-e2e/references/progressive-01-/345/205/250/350/207/252/345/212/250/347/231/273/345/275/225-/345/205/215/351/252/214/350/257/201/347/240/201-/344/275/206/344/270/215/345/205/215/345/257/206/347/240/201-/345/277/205/350/257/273.md +173 -0
- package/skills/playwright-e2e/references/progressive-02-/346/226/207/345/255/227/345/257/271/346/257/224/345/272/246/344/270/216/345/217/257/350/257/273/346/200/247/350/207/252/345/212/250/345/214/226/346/243/200/346/237/245-/345/277/205/345/201/232.md +183 -0
- package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +221 -0
- package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +69 -0
- package/skills/scripts/optimize-progressive-disclosure.mjs +204 -0
- package/skills/scripts/refresh-progressive-disclosure.mjs +64 -0
- package/skills/scripts/validate-progressive-disclosure.mjs +52 -0
- package/skills/ui-design/SKILL.md +26 -1461
- package/skills/ui-design/references/progressive-01-/351/242/234/350/211/262/344/275/223/347/263/273-css-variables-/346/224/257/346/214/201/344/270/273/351/242/230/345/210/207/346/215/242.md +218 -0
- package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +155 -0
- package/skills/ui-design/references/progressive-03-/345/212/250/346/225/210/350/247/204/350/214/203-/344/270/260/345/257/214/344/275/206/344/270/215/345/215/241.md +235 -0
- package/skills/ui-design/references/progressive-04-/347/273/204/344/273/266/351/243/216/346/240/274/351/200/237/346/237/245.md +152 -0
- package/skills/ui-design/references/progressive-05-/347/247/273/345/212/250/347/253/257/344/270/223/347/224/250/350/247/204/350/214/203.md +238 -0
- package/skills/ui-design/references/progressive-06-/344/270/273/351/242/230/345/210/207/346/215/242/345/256/236/347/216/260.md +194 -0
- package/skills/ui-design/references/progressive-07-/351/200/237/346/237/245-/344/273/216/345/244/264/346/220/255/345/273/272/344/270/200/344/270/252/347/247/273/345/212/250/347/253/257/351/241/265/351/235/242.md +207 -0
- package/skills/ui-design/references/progressive-08-/350/241/250/345/215/225/345/210/206/347/273/204/350/247/204/350/214/203-tabs-vs-collapsegroup-/345/274/272/345/210/266.md +142 -0
- package/skills/v8-crud-api/SKILL.md +20 -245
- package/skills/v8-crud-api/references/progressive-01-/346/237/245/350/257/242/345/210/227/350/241/250-/345/210/206/351/241/265.md +226 -0
- package/skills/v8-crud-api/references/progressive-02-where-/346/235/241/344/273/266/350/257/255/346/263/225/351/200/237/346/237/245.md +49 -0
- package/skills/v8-export-import/SKILL.md +15 -425
- package/skills/v8-export-import/references/progressive-01-excellayout-/351/253/230/347/272/247/350/207/252/347/224/261/345/270/203/345/261/200.md +211 -0
- package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +202 -0
- package/skills/v8-export-import/references/progressive-03-/345/256/211/345/205/250-/346/200/247/350/203/275/346/263/250/346/204/217.md +42 -0
- package/skills/v8-file-upload/SKILL.md +16 -354
- package/skills/v8-file-upload/references/progressive-01-/345/205/254/346/234/211/346/241/266-vs-/347/247/201/346/234/211/346/241/266.md +227 -0
- package/skills/v8-file-upload/references/progressive-02-office-/346/226/207/344/273/266/345/234/250/347/272/277/347/274/226/350/276/221/347/211/210/346/234/254/345/217/267/350/247/204/345/210/231.md +149 -0
- package/skills/v8-frontend-events/SKILL.md +19 -205
- package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +219 -0
- package/skills/v8-http-integration/SKILL.md +14 -236
- package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +220 -0
- package/skills/v8-http-integration/references/progressive-02-/351/224/231/350/257/257/345/244/204/347/220/206/346/250/241/345/274/217.md +44 -0
- package/skills/v8-menu-buttons/SKILL.md +15 -511
- package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +221 -0
- package/skills/v8-menu-buttons/references/progressive-02-8-/346/250/241/345/274/217-f-/345/220/216/345/217/260/344/273/273/345/212/241/346/214/211/351/222/256-/351/225/277/344/273/273/345/212/241.md +224 -0
- package/skills/v8-menu-buttons/references/progressive-03-10-/345/217/215/346/250/241/345/274/217-/351/201/277/345/205/215.md +104 -0
- package/skills/v8-mq-mqtt/SKILL.md +11 -175
- package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +181 -0
- package/skills/v8-security/SKILL.md +16 -329
- package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +199 -0
- package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +158 -0
- package/skills/v8-table-event/SKILL.md +16 -236
- package/skills/v8-table-event/references/progressive-01-informv8-js-/350/241/250/345/215/225/346/211/223/345/274/200/344/272/213/344/273/266.md +216 -0
- package/skills/v8-table-event/references/progressive-02-/345/211/215/347/253/257/344/272/213/344/273/266/345/220/215-v8-eventname-/345/217/257/350/203/275/347/232/204/345/200/274.md +46 -0
- package/skills/v8-workflow/SKILL.md +19 -160
- package/skills/v8-workflow/references/progressive-01-/350/212/202/347/202/271/345/274/200/345/247/213-v8-/344/272/213/344/273/266.md +180 -0
- package/skills/workspace-conventions/SKILL.md +29 -361
- package/skills/workspace-conventions/references/progressive-01-/347/211/210/346/234/254/346/233/264/346/226/260/346/227/245/345/277/227/344/277/235/346/212/244/350/247/204/345/210/231-/345/274/272/345/210/266.md +208 -0
- package/skills/workspace-conventions/references/progressive-02-microi-net-api-/346/234/254/345/234/260/345/220/257/345/212/250/347/272/246/345/256/232.md +196 -0
- package/skills/workspace-conventions/references/progressive-03-cli-/344/270/216-ide-/346/217/222/344/273/266/351/224/231/347/211/210/345/205/261/345/255/230/347/272/246/345/256/232.md +27 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
# v8-http-integration 详细参考 1
|
|
2
|
+
|
|
3
|
+
> 按需读取;本文件由 SKILL.md 的原章节无损拆分。
|
|
4
|
+
|
|
5
|
+
<!-- microi-progressive:chunk id=v8-http-integration-004 sha256=88c4d57c8f52d60f547b92fc14c0552fa9283e857c65fac4ae4b756f39997260 -->
|
|
6
|
+
## GET 请求
|
|
7
|
+
|
|
8
|
+
```javascript
|
|
9
|
+
// 对象参数格式
|
|
10
|
+
var result = V8.Http.Get({
|
|
11
|
+
Url: 'https://api.example.com/users',
|
|
12
|
+
GetParam: { page: 1, size: 20 }, // URL 查询参数
|
|
13
|
+
Timeout: 10,
|
|
14
|
+
Headers: { Authorization: 'Bearer ' + token }
|
|
15
|
+
});
|
|
16
|
+
var data = JSON.parse(result);
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
<!-- /microi-progressive:chunk -->
|
|
20
|
+
<!-- microi-progressive:chunk id=v8-http-integration-005 sha256=ae05f44b4857a7244fdeafab994ef41217252694228569a9701988a3857b5438 -->
|
|
21
|
+
## 获取完整响应(含状态码和响应头)
|
|
22
|
+
|
|
23
|
+
```javascript
|
|
24
|
+
var resp = V8.Http.PostResponse({
|
|
25
|
+
Url: 'https://api.example.com/submit',
|
|
26
|
+
PostParamString: JSON.stringify({ orderId: V8.Param.orderId }),
|
|
27
|
+
ParamType: 'json'
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
if (resp.StatusCode !== 200) {
|
|
31
|
+
return { Code: 0, Msg: '第三方接口返回 ' + resp.StatusCode };
|
|
32
|
+
}
|
|
33
|
+
// resp.Content — 响应内容(字符串)
|
|
34
|
+
// resp.Headers — 响应头数组 [{ Name: '', Value: '' }]
|
|
35
|
+
// resp.StatusCode — HTTP 状态码
|
|
36
|
+
|
|
37
|
+
var data = JSON.parse(resp.Content);
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
PATCH 完整响应写法相同:
|
|
41
|
+
|
|
42
|
+
```javascript
|
|
43
|
+
var resp = V8.Http.PatchResponse({
|
|
44
|
+
Url: 'https://api.example.com/users/123',
|
|
45
|
+
PatchParam: { status: 'enabled' },
|
|
46
|
+
ParamType: 'json'
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
前端调用时写为 `await V8.Http.PostResponse(...)` 或 `await V8.Http.PatchResponse(...)`。
|
|
51
|
+
|
|
52
|
+
### 后端 SSRF 与重定向边界
|
|
53
|
+
|
|
54
|
+
- 严格 SSRF 防护默认关闭;未配置时完全保留历史行为,不限制协议、URL 内嵌凭据、回环、私网、链路本地或云元数据地址,并继续自动处理重定向。
|
|
55
|
+
- 只有在 SaaS 引擎主租户启用 `SsrfProtectionEnabled` 后,后端才只允许 HTTP(S),拒绝 URL 内嵌凭据、回环、私网、链路本地、云元数据和其它特殊地址,并禁止自动跟随 3xx。
|
|
56
|
+
- 严格模式需要跳转时读取完整响应的 `StatusCode` / `Headers`,经业务判断后显式发起下一次调用,使每一跳重新校验。
|
|
57
|
+
- 严格模式的 SaaS 字段 `SsrfAllowedHosts` 只能加入受控且固定的精确主机,不接受用户输入,不要配置通配。
|
|
58
|
+
- DNS 校验不能代替网络层出站 ACL。生产环境还应在容器、主机或网关阻断云元数据和非必要私网段。
|
|
59
|
+
|
|
60
|
+
<!-- /microi-progressive:chunk -->
|
|
61
|
+
<!-- microi-progressive:chunk id=v8-http-integration-006 sha256=b5e8b317857ac4d81818ba230dadd927d12ef9cddb989921bdbeffe8e96527a3 -->
|
|
62
|
+
## 前端 V8 行为与兼容性
|
|
63
|
+
|
|
64
|
+
- 前端新代码应优先使用 `await V8.Http.Get/Post/Patch`,参数与后端一致;不要再把 `V8.Post/Get` 作为新功能首选。旧 `V8.Post/Get` 仅作为兼容 API 保留,其回调和 Promise 写法保持不变。
|
|
65
|
+
- 相对地址或当前 `ApiBase` 地址会沿用吾码登录头,并接收响应中的新 `authorization`;第三方绝对地址不会自动携带吾码 Token,避免凭据泄漏。
|
|
66
|
+
- 浏览器请求第三方地址受 CORS 限制;这是浏览器安全策略,后端 `V8.Http` 不受浏览器 CORS 限制。
|
|
67
|
+
- 前端字符串方法同后端一样返回原始响应文本,不会自动 `JSON.parse`;需要对象时显式解析。
|
|
68
|
+
- 浏览器端不支持后端的 `FilesStream`,可使用 `FilesByteBase64`、`FilesByteString` 或 `FilesByte`。
|
|
69
|
+
|
|
70
|
+
<!-- /microi-progressive:chunk -->
|
|
71
|
+
<!-- microi-progressive:chunk id=v8-http-integration-007 sha256=92a9eea0bf36292444a9aae6cc73c91eda6e9b5d8d8ce78f6b8ca50cc47c28f8 -->
|
|
72
|
+
## 下载远程文件(图片、PDF 等二进制)
|
|
73
|
+
|
|
74
|
+
```javascript
|
|
75
|
+
var resp = V8.Http.GetResponse({
|
|
76
|
+
Url: 'https://example.com/file.png',
|
|
77
|
+
Timeout: 30
|
|
78
|
+
});
|
|
79
|
+
if (resp.StatusCode !== 200) return { Code: 0, Msg: '下载失败' };
|
|
80
|
+
|
|
81
|
+
var bytes = resp.RawBytes; // .NET byte[]
|
|
82
|
+
var base64 = System.Convert.ToBase64String(bytes);
|
|
83
|
+
|
|
84
|
+
// 转存到 HDFS
|
|
85
|
+
var up = V8.Method.Upload({
|
|
86
|
+
FilesByteBase64: { 'remote.png': base64 },
|
|
87
|
+
Limit: false, Path: '/imported', OsClient: V8.OsClient
|
|
88
|
+
});
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
> 文件上传/下载完整模式见 `v8-file-upload/SKILL.md`
|
|
92
|
+
|
|
93
|
+
<!-- /microi-progressive:chunk -->
|
|
94
|
+
<!-- microi-progressive:chunk id=v8-http-integration-008 sha256=81da35a51dd4d8e43ddc5242045ca0b4590ed140d589b491e45b41231b7c13d2 -->
|
|
95
|
+
## 第三方密钥不要硬编码
|
|
96
|
+
|
|
97
|
+
```javascript
|
|
98
|
+
// ❌ 危险:密钥写死在代码
|
|
99
|
+
var apiKey = 'sk-xxxxxxxx';
|
|
100
|
+
|
|
101
|
+
// ✅ 正确:放在 SaaS 引擎的 OsClientModel
|
|
102
|
+
var apiKey = V8.OsClientModel.OpenAIKey;
|
|
103
|
+
var secret = V8.OsClientModel.WxPaySecret;
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
详见 `v8-saas-multi-tenant/SKILL.md`
|
|
107
|
+
```javascript
|
|
108
|
+
// GET 完整响应
|
|
109
|
+
var resp = V8.Http.GetResponse({
|
|
110
|
+
Url: 'https://api.example.com/data',
|
|
111
|
+
GetParam: { id: '123' }
|
|
112
|
+
});
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
<!-- /microi-progressive:chunk -->
|
|
116
|
+
<!-- microi-progressive:chunk id=v8-http-integration-009 sha256=a12a323aae2e4bb30c3a998e570b6ed8c7e76641afe0f54dffd7701611ff1c6e -->
|
|
117
|
+
## 实战模式
|
|
118
|
+
|
|
119
|
+
### 微信小程序 access_token
|
|
120
|
+
|
|
121
|
+
```javascript
|
|
122
|
+
var cacheKey = 'Microi:' + V8.OsClient + ':wx_access_token';
|
|
123
|
+
var token = V8.Cache.Get(cacheKey);
|
|
124
|
+
|
|
125
|
+
if (!token) {
|
|
126
|
+
var appId = V8.OsClientModel.WxAppId; // 敏感配置存在 SaaS 引擎中
|
|
127
|
+
var secret = V8.OsClientModel.WxAppSecret;
|
|
128
|
+
var result = V8.Http.Get({
|
|
129
|
+
Url: 'https://api.weixin.qq.com/cgi-bin/token',
|
|
130
|
+
GetParam: { grant_type: 'client_credential', appid: appId, secret: secret }
|
|
131
|
+
});
|
|
132
|
+
var data = JSON.parse(result);
|
|
133
|
+
|
|
134
|
+
if (data.access_token) {
|
|
135
|
+
token = data.access_token;
|
|
136
|
+
V8.Cache.Set(cacheKey, token, '0.01:56:00'); // 缓存 1 小时 56 分钟
|
|
137
|
+
} else {
|
|
138
|
+
return { Code: 0, Msg: '获取 access_token 失败: ' + (data.errmsg || '') };
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return { Code: 1, Data: { access_token: token } };
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### 签名验证(HmacSHA256)
|
|
146
|
+
|
|
147
|
+
```javascript
|
|
148
|
+
var timestamp = V8.Action.GetTimestamp().toString();
|
|
149
|
+
var nonce = System.Guid.NewGuid().ToString().replace(/-/g, '').substring(0, 16);
|
|
150
|
+
var body = JSON.stringify({ orderId: V8.Param.orderId });
|
|
151
|
+
var signStr = timestamp + '\n' + nonce + '\n' + body + '\n';
|
|
152
|
+
var signature = V8.EncryptHelper.HmacSha256(apiSecret, signStr);
|
|
153
|
+
|
|
154
|
+
var result = V8.Http.Post({
|
|
155
|
+
Url: 'https://api.example.com/pay',
|
|
156
|
+
PostParamString: body,
|
|
157
|
+
ParamType: 'json',
|
|
158
|
+
Headers: {
|
|
159
|
+
'X-Timestamp': timestamp,
|
|
160
|
+
'X-Nonce': nonce,
|
|
161
|
+
'X-Signature': signature
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### 调用其他 Microi 接口引擎
|
|
167
|
+
|
|
168
|
+
```javascript
|
|
169
|
+
// 不需要 HTTP,直接内部调用(可共享事务)
|
|
170
|
+
var result = V8.ApiEngine.Run('calculate-price', {
|
|
171
|
+
productId: V8.Param.productId,
|
|
172
|
+
quantity: V8.Param.quantity
|
|
173
|
+
}, V8.DbTrans);
|
|
174
|
+
|
|
175
|
+
if (result.Code !== 1) {
|
|
176
|
+
return { Code: 0, Msg: '价格计算失败: ' + result.Msg };
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Webhook 回调处理
|
|
181
|
+
|
|
182
|
+
```javascript
|
|
183
|
+
// 接收外部 Webhook(将此引擎作为 Webhook URL)
|
|
184
|
+
var payload = V8.Param;
|
|
185
|
+
|
|
186
|
+
V8.Method.AddSysLog({
|
|
187
|
+
Title: 'Webhook',
|
|
188
|
+
Content: JSON.stringify(payload),
|
|
189
|
+
Type: 'third-party'
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
if (payload.event === 'payment.success') {
|
|
193
|
+
V8.FormEngine.UptFormDataByWhere('OrderHeader', {
|
|
194
|
+
_Where: [['OrderNo', '=', payload.order_no]],
|
|
195
|
+
PayStatus: 'paid',
|
|
196
|
+
PayTime: DateNow('yyyy-MM-dd HH:mm:ss')
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
return { Code: 1, Msg: 'ok' };
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
<!-- /microi-progressive:chunk -->
|
|
204
|
+
<!-- microi-progressive:chunk id=v8-http-integration-010 sha256=34d6d62f7d02a585b17bc93f65c260be7c50529f65b4f9ea4ec12da4285f82da -->
|
|
205
|
+
## V8.Office.SendEmail — 发送邮件
|
|
206
|
+
|
|
207
|
+
```javascript
|
|
208
|
+
V8.Office.SendEmail({
|
|
209
|
+
SmtpServer: 'smtp.qq.com',
|
|
210
|
+
SmtpPort: 587,
|
|
211
|
+
EnableSSL: true,
|
|
212
|
+
SystemEmail: 'admin@itdos.com',
|
|
213
|
+
SystemEmailPwd: 'password',
|
|
214
|
+
EmailSubject: '邮件标题',
|
|
215
|
+
EmailBody: '<b>HTML内容</b>',
|
|
216
|
+
Receivers: ['123@qq.com', '456@qq.com']
|
|
217
|
+
});
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
<!-- /microi-progressive:chunk -->
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# v8-http-integration 详细参考 2
|
|
2
|
+
|
|
3
|
+
> 按需读取;本文件由 SKILL.md 的原章节无损拆分。
|
|
4
|
+
|
|
5
|
+
<!-- microi-progressive:chunk id=v8-http-integration-011 sha256=b446647747ac6672f011f1cdc9bade6c6af774c7bf737472976f8ac49bbc7709 -->
|
|
6
|
+
## 错误处理模式
|
|
7
|
+
|
|
8
|
+
```javascript
|
|
9
|
+
try {
|
|
10
|
+
var response = V8.Http.Post({
|
|
11
|
+
Url: url,
|
|
12
|
+
PostParamString: body,
|
|
13
|
+
ParamType: 'json',
|
|
14
|
+
Timeout: 10
|
|
15
|
+
});
|
|
16
|
+
var result = JSON.parse(response);
|
|
17
|
+
|
|
18
|
+
if (result.code !== 0) {
|
|
19
|
+
console.error('Third-party API error: ' + response);
|
|
20
|
+
return { Code: 0, Msg: '第三方接口错误: ' + (result.message || result.msg || '') };
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return { Code: 1, Data: result.data };
|
|
24
|
+
} catch (ex) {
|
|
25
|
+
console.error('HTTP request failed: ' + ex.message);
|
|
26
|
+
return { Code: 0, Msg: '请求第三方接口失败,请稍后重试' };
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
<!-- /microi-progressive:chunk -->
|
|
31
|
+
<!-- microi-progressive:chunk id=v8-http-integration-012 sha256=5be87e89ec429dd9b79e89014485b7745c2a400f2066d0d989f71c9779de32fc -->
|
|
32
|
+
## 注意事项
|
|
33
|
+
|
|
34
|
+
- `V8.Http.Post` 的 `PostParam` 不支持多级嵌套对象,嵌套需用 `PostParamString`
|
|
35
|
+
- `V8.Http.Patch` 的 `PatchParam` 不支持多级嵌套对象,嵌套需用 `PatchParamString`
|
|
36
|
+
- `Headers` 参数也可以写成 `Header`(两者等效)
|
|
37
|
+
- 前端 `V8.Http` 必须使用 `await`;后端接口引擎无需 `await`
|
|
38
|
+
- 旧版前端 `V8.Post/Get` 是兼容 API,不能删除;但新代码必须优先使用 `V8.Http`
|
|
39
|
+
- 第三方 API 密钥建议存在 `V8.OsClientModel`(SaaS 引擎)中,不要硬编码
|
|
40
|
+
- 调用外部接口应加 try-catch,第三方服务不可控
|
|
41
|
+
- 对于需要缓存的 token(如微信 access_token),使用 `V8.Cache` 避免频繁请求
|
|
42
|
+
- 缓存过期时间格式为 `d.HH:mm:ss`,如 `0.01:00:00` 表示 1 小时
|
|
43
|
+
- 内部接口引擎之间的调用用 `V8.ApiEngine.Run()`,不需要 HTTP
|
|
44
|
+
<!-- /microi-progressive:chunk -->
|