hap-v3-api
npx skills add https://github.com/garfield-bb/hap-skills-collection --skill hap-v3-api
Agent 安装分布
Skill 文档
HAP V3 API ä½¿ç¨æè½
æ¤æè½æä¾ä½¿ç¨æéäº HAP V3 æ¥å£æå»ºé¡µé¢ã宿¶è·åæ°æ®åæä½æ°æ®ç宿´æåã
Overview
æéäº HAP (High-performance Application Platform) æ¯ä¸ä¸ªè¶ 级åºç¨å¹³å°,éè¿è¿ä¸ªåºåº§å¯ä»¥æå»ºå¾å¤åºç¨ãéè¿ HAP V3 æ¥å£,æ¨å¯ä»¥:
- å¨èªå®ä¹è§å¾æä»¶ä¸è°ç¨ V3 æ¥å£æä½æ°æ®
- å¨ç¬ç«å端页é¢ä¸ä½¿ç¨ V3 æ¥å£ç¼æä¸å¡é»è¾
- 宿¶è·ååæä½æéäºåºç¨ä¸çæ°æ®
æ ¸å¿è½å:
- â 宿´ç API 使ç¨å·¥ä½æµï¼ä»é¶æå»ºåºç¨å°æ°æ®æä½ï¼
- â 详ç»çåæ®µç±»åå¤çè§è
- â Filter çéå¨å®æ´è¯æ³
- â å ³èåæ®µæ·±åº¦æ¥è¯¢æå
- â 常è§é·é±åè§£å³æ¹æ¡
- â æ§è½ä¼åæä½³å®è·µ
è¯¦ç»ææ¡£: åè references/hap-api-usage-guide.md è·å宿´ç API 使ç¨è§è
â ï¸ éè¦ï¼ä½æ¶ä½¿ç¨æ¤æè½
使ç¨ä¼å 级è§å:
ä¼å 级 1: å·²é ç½® HAP MCP â ç´æ¥ä½¿ç¨ MCP å·¥å · â
å¦æç¨æ·å·²ç»é ç½®äº HAP åºç¨æ§è¡ MCPï¼AI åºè¯¥ç´æ¥ä½¿ç¨ MCP å·¥å ·ï¼è䏿¯ç¼å API 请æ±ä»£ç ã
MCP å·¥å ·ä¼å¿:
- â æ éæå¨å¤çé´æ
- â æ éç¼å请æ±ä»£ç
- â MCP å·¥å ·èªå¨å¤çææç»è
- â æ´ç®æ´ãæ´å¯é
å¯ç¨ç MCP å·¥å ·:
get_app_info– è·ååºç¨ä¿¡æ¯get_app_worksheets_list– è·åå·¥ä½è¡¨å表get_worksheet_structure– è·åå·¥ä½è¡¨ç»æget_record_list– æ¥è¯¢è®°å½å表get_record_pivot_data– è·åéè§è¡¨æ°æ®create_record– å建记å½update_record– æ´æ°è®°å½delete_record– å é¤è®°å½batch_create_records– æ¹éå建记å½batch_update_records– æ¹éæ´æ°è®°å½batch_delete_records– æ¹éå é¤è®°å½- çç…ï¼å®æ´å表请åè MCP å·¥å ·ææ¡£ï¼
ç¤ºä¾ – ä½¿ç¨ MCP å·¥å ·æ¥è¯¢æ°æ®:
// â
æ£ç¡® - ç´æ¥ä½¿ç¨ MCP å·¥å
·
const records = await mcpClient.call('get_record_list', {
worksheet_id: 'xxx',
pageSize: 100,
pageIndex: 1,
filter: {
type: 'group',
logic: 'AND',
children: [
{
type: 'condition',
field: 'status',
operator: 'eq',
value: ['å·²æäº¤']
}
]
}
});
// â é误 - ä¸è¦ç¼å API 请æ±ä»£ç
// fetch('https://api.mingdao.com/v3/open/worksheet/getFilterRows', ...)
ä¼å 级 2: ä» å¨ä»¥ä¸æ åµä½¿ç¨ HAP V3 API ç¼å代ç
使¶ä½¿ç¨ V3 API 代ç :
- â ç¨æ·æç¡®éè¦ç¼å代ç å®ç°ï¼å¦å¨è§å¾æä»¶ãç¬ç«å端项ç®ä¸éæï¼
- â ç¨æ·éè¦å¨ä»£ç ä¸ç¼æå¤æçä¸å¡é»è¾
- â æªé ç½® HAP MCP æ MCP ä¸å¯ç¨
示ä¾åºæ¯:
- “帮æå¨ React ç»ä»¶ä¸éæ HAP API æ¥è¯¢æ°æ®” â â ä½¿ç¨ V3 API 代ç
- “帮æåä¸ä¸ªå½æ°ï¼æ¹éå¯¼å ¥æ°æ®å° HAP” â â ä½¿ç¨ V3 API 代ç
- “å¸®ææ¥è¯¢å®¢æ·ç®¡ç表ä¸çæ°æ®”ï¼å·²é ç½® MCPï¼â â ä¸è¦å代ç ï¼ä½¿ç¨ MCP å·¥å ·
å¿«éå¼å§
1. è·å API åè¯
æ¹æ³ä¸: ä» MCP é ç½®ä¸æåï¼æ¨èï¼
å¦æç¨æ·å·²ç»é ç½®äº HAP åºç¨æ§è¡ MCPï¼AI 婿åºè¯¥èªå¨ä» MCP é ç½®ä¸æåé´æå¯é¥ï¼è䏿¯è®©ç¨æ·æå¨è¾å ¥ã
â ï¸ éè¦: AI å¿ é¡»èªå¨æ£æµç¨æ·å½å使ç¨ç IDEï¼ç¶å读å对åºçé ç½®æä»¶ãä¸è¦åè®¾ç¨æ·ä½¿ç¨ Cursorã
èªå¨åæåæ¥éª¤
Step 1: èªå¨æ£æµå½å使ç¨ç IDE å¹³å°
AI å¿ é¡»èªå¨æ£æµç¨æ·å½å使ç¨ç IDEï¼ä¸è¦å设æè¯¢é®ãæ£æµæ¹æ³ï¼æä¼å 级ï¼ï¼
-
æ£æµå½åè¿è¡ç IDEï¼æé«ä¼å 级ï¼
- æ£æ¥ç¯å¢åéï¼
$TERM_PROGRAMï¼å¯è½å¼ï¼cursor,claude,traeçï¼ - æ£æ¥ä¼è¯åéï¼
$CLAUDE_SESSION,$TRAE_SESSION,$ANTIGRAVITY_SESSIONç - æ£æ¥è¿ç¨ï¼
pgrep -x "Cursor",pgrep -x "Claude"ç
- æ£æ¥ç¯å¢åéï¼
-
æ£æ¥å·²å®è£ ç IDEï¼å¦æç¬¬1æ¥å¤±è´¥ï¼
- æ£æ¥é
ç½®ç®å½ï¼
~/.cursor,~/.claude,~/.traeçæ¯å¦åå¨ - å¦ææ£æµå°å¤ä¸ªï¼ææµè¡åº¦éæ©ï¼Cursor â Claude Code â TRAE â å ¶ä»
- æ£æ¥é
ç½®ç®å½ï¼
-
æ£æ¥é¡¹ç®çº§é ç½®ï¼å¦æå2æ¥å¤±è´¥ï¼
- æ£æ¥å½å项ç®ç®å½ï¼
.cursor/,.trae/,.claude/ç
- æ£æ¥å½å项ç®ç®å½ï¼
æ¯æç IDE å¹³å°åé 置路å¾ï¼
| IDE å¹³å° | å ¨å±é ç½®æä»¶è·¯å¾ | 项ç®çº§é ç½®è·¯å¾ |
|---|---|---|
| Claude Code | ~/.claude/config.json æéè¿ claude mcp list å½ä»¤ |
.claude/config.json |
| Cursor | ~/.cursor/mcp.json æ ~/Library/Application Support/Cursor/User/settings.json (macOS) |
.cursor/mcp.json |
| TRAE | ~/.trae/mcp.json |
.trae/mcp.json |
| GitHub Copilot | ~/.copilot/mcp.json |
.github/mcp.json |
| Antigravity | ~/.gemini/antigravity/config.json |
.agent/config.json |
| OpenCode | ~/.config/opencode/mcp.json |
.opencode/mcp.json |
| Windsurf | ~/.codeium/windsurf/mcp.json |
.windsurf/mcp.json |
| Gemini CLI | ~/.gemini/config.json |
.gemini/config.json |
| Codex | ~/.codex/config.toml |
.codex/config.toml |
| Manus | ~/.manus/mcp.json |
– |
| Coze | ~/.coze/mcp_config.json |
– |
Step 2: 读å对åºå¹³å°ç MCP é ç½®æä»¶
æ ¹æ®æ£æµå°çå¹³å°ï¼è¯»å对åºçé ç½®æä»¶ã
Step 3: æ¥æ¾ HAP MCP é ç½®
- å¨é
ç½®å¯¹è±¡ä¸æ¥æ¾ä»¥
hap-mcp-å¼å¤´çæå¡å¨é ç½® - è¯å«åºç¨æ§è¡ MCPï¼å
å«
urlåæ®µä¸ URL æåapi.mingdao.com/mcpï¼
MCP é ç½®æ ¼å¼ç¤ºä¾ï¼
{
"mcpServers": {
"hap-mcp-åºç¨å": {
"url": "https://api.mingdao.com/mcp?HAP-Appkey=6802bfa5da37d75f&HAP-Sign=MWZmZWU1YmMyMzE4ZTAxYjY3NTViYjM5NzhlNTdhOTIwZWFhYTc2Y2I2YzljNWMzNDFmMjk4NTM2N2M0YTg2OA=="
}
}
}
Step 4: ä» URL ä¸è§£æé´æåæ°
- ä» URL çæ¥è¯¢åæ°ä¸æå
HAP-Appkeyçå¼ - ä» URL çæ¥è¯¢åæ°ä¸æå
HAP-Signçå¼ - 注æï¼URL åæ°å¯è½ç»è¿ URL ç¼ç ï¼éè¦æ£ç¡®è§£ç
代ç 示ä¾ï¼AI 婿æä½ï¼
// 1. æ£æµå½å使ç¨ç IDE å¹³å°
function detectCurrentIDE() {
// æ£æ¥ç¯å¢åé
const termProgram = process.env.TERM_PROGRAM;
if (termProgram === 'cursor') return 'cursor';
if (termProgram === 'claude') return 'claude';
if (termProgram === 'trae') return 'trae';
// æ£æ¥ä¼è¯åé
if (process.env.CLAUDE_SESSION) return 'claude';
if (process.env.TRAE_SESSION) return 'trae';
if (process.env.ANTIGRAVITY_SESSION) return 'antigravity';
// æ£æ¥å·²å®è£
ç IDEï¼éçº§æ£æ¥ï¼
const homeDir = process.env.HOME || process.env.USERPROFILE;
if (fs.existsSync(path.join(homeDir, '.cursor', 'mcp.json'))) return 'cursor';
if (fs.existsSync(path.join(homeDir, '.claude', 'config.json'))) return 'claude';
if (fs.existsSync(path.join(homeDir, '.trae', 'mcp.json'))) return 'trae';
// é»è®¤ä½¿ç¨ Cursorï¼ææµè¡ï¼
return 'cursor';
}
// 2. æ ¹æ® IDE è·åé
ç½®æä»¶è·¯å¾
function getConfigPath(ide) {
const homeDir = process.env.HOME || process.env.USERPROFILE;
const configPaths = {
'cursor': path.join(homeDir, '.cursor', 'mcp.json'),
'claude': path.join(homeDir, '.claude', 'config.json'),
'trae': path.join(homeDir, '.trae', 'mcp.json'),
'copilot': path.join(homeDir, '.copilot', 'mcp.json'),
'antigravity': path.join(homeDir, '.gemini', 'antigravity', 'config.json'),
'opencode': path.join(homeDir, '.config', 'opencode', 'mcp.json'),
'windsurf': path.join(homeDir, '.codeium', 'windsurf', 'mcp.json'),
'gemini': path.join(homeDir, '.gemini', 'config.json'),
'codex': path.join(homeDir, '.codex', 'config.toml'),
'manus': path.join(homeDir, '.manus', 'mcp.json'),
'coze': path.join(homeDir, '.coze', 'mcp_config.json')
};
return configPaths[ide];
}
// 3. 读åå¹¶è§£æé
ç½®
const currentIDE = detectCurrentIDE();
const configPath = getConfigPath(currentIDE);
if (!fs.existsSync(configPath)) {
console.log(`æªæ¾å° ${currentIDE} ç MCP é
ç½®æä»¶`);
return;
}
const configContent = fs.readFileSync(configPath, 'utf8');
const config = JSON.parse(configContent);
// 4. æ¥æ¾ HAP MCP é
ç½®
const mcpServers = config.mcpServers || {};
const hapMcpConfig = Object.entries(mcpServers).find(
([name, config]) => name.startsWith('hap-mcp-') && config.url
);
if (hapMcpConfig) {
const [mcpName, mcpConfig] = hapMcpConfig;
const url = new URL(mcpConfig.url);
// 5. æå Appkey å Sign
const appkey = url.searchParams.get('HAP-Appkey');
const sign = url.searchParams.get('HAP-Sign');
console.log(`â
ä» ${currentIDE} ç MCP é
ç½®ä¸æåå°é´æä¿¡æ¯`);
console.log('MCP åç§°:', mcpName);
console.log('Appkey:', appkey);
console.log('Sign:', sign);
} else {
console.log(`æªæ¾å° HAP MCP é
ç½®ï¼è¯·å
é
ç½® MCP ææå¨è¾å
¥é´æä¿¡æ¯`);
}
å®é æä½æµç¨
å½ç¨æ·éè¦è°ç¨ HAP API æ¶ï¼AI åºè¯¥ï¼
-
æ£æ¥æ¯å¦å·²é ç½® MCP
- 读å Cursor å ¨å±è®¾ç½®æä»¶
- æ¥æ¾
hap-mcp-*é ç½®
-
æåé´æä¿¡æ¯
- 妿æ¾å° MCP é ç½®ï¼èªå¨ä» URL 䏿å Appkey å Sign
- 妿æ¾å°å¤ä¸ª MCP é ç½®ï¼è¯¢é®ç¨æ·ä½¿ç¨åªä¸ªåºç¨
-
ä½¿ç¨æåçå¯é¥
- å¨ API 请æ±å¤´ä¸ä½¿ç¨æåç
HAP-AppkeyåHAP-Sign - 妿æåå¤±è´¥ï¼æç¤ºç¨æ·æå¨æä¾ææ£æ¥ MCP é ç½®
- å¨ API 请æ±å¤´ä¸ä½¿ç¨æåç
注æäºé¡¹
- â ä¼å ä½¿ç¨ MCP é ç½®: å¦æç¨æ·å·²é ç½® MCPï¼ä¼å ä»é ç½®ä¸æå
- â URL è§£ç : 注æ URL åæ°å¯è½ç»è¿ç¼ç ï¼éè¦æ£ç¡®è§£ç
- â å¤ä¸ªåºç¨: 妿é ç½®äºå¤ä¸ª HAP MCPï¼è¯¢é®ç¨æ·ä½¿ç¨åªä¸ªåºç¨
- â ï¸ é ç½®ä¸åå¨: å¦ææªæ¾å° MCP é ç½®ï¼æç¤ºç¨æ·å é ç½® MCP ææå¨æä¾å¯é¥
- â ï¸ æéé®é¢: å¦ææ æ³è¯»åé ç½®æä»¶ï¼æç¤ºç¨æ·æ£æ¥æä»¶æé
æ¹æ³äº: æå¨è·å
å¦æç¨æ·æªé ç½® MCP æéè¦æå¨æä¾ï¼
- ç»å½æéäº â åºç¨ â 设置 â API å¯é¥
- å¤å¶ Appkey å Sign
- ææä¾ MCP é 置信æ¯ï¼è®© AI èªå¨æå
2. é 置请æ±å¤´
ææ HAP V3 API 请æ±é½éè¦ä»¥ä¸è¯·æ±å¤´:
const headers = {
'Content-Type': 'application/json',
'HAP-Appkey': 'your-app-key',
'HAP-Sign': 'your-sign-key'
};
â ï¸ æ³¨æ: 请æ±å¤´ä½¿ç¨ HAP-Appkey å HAP-Signï¼ä¸æ¯ AppKey å Signï¼
3. è·å API ææ¡£
ä½¿ç¨ Apifox MCP Serverï¼æ¨èï¼:
{
"åºç¨ API - API ææ¡£": {
"command": "npx",
"args": [
"-y",
"apifox-mcp-server@latest",
"--site-id=5442569"
]
}
}
å¨çº¿ææ¡£èµæº:
æ ¸å¿å·¥ä½æµç¨
é¶æ®µä¸: åå¤å·¥ä½
Step 1: è·å API åè¯
- ä¼å æ¹å¼: ä» Cursor MCP é ç½®ä¸èªå¨æå Appkey å Signï¼å¦æç¨æ·å·²é ç½®ï¼
- å¤éæ¹å¼: ä» HAP åå°æå¨è·åæè®©ç¨æ·æä¾
Step 2: é ç½® API 请æ±å¤´
- ä½¿ç¨æåææä¾ç Appkey å Sign 设置请æ±å¤´
- 设置
HAP-AppkeyåHAP-Sign请æ±å¤´
é¶æ®µäº: å建åºç¨ç»æ
Step 3: è·ååºç¨ä¿¡æ¯ï¼å¯éï¼
GET /v3/app/info
Step 4: å建工ä½è¡¨
POST /v3/app/worksheets
{
"name": "客æ·ä¿¡æ¯è¡¨",
"alias": "customers",
"fields": [
{
"name": "客æ·åç§°",
"alias": "customer_name",
"type": "Text",
"isTitle": true,
"required": true
}
]
}
详ç»è§è: åè references/hap-api-usage-guide.md 第 1 è
é¶æ®µä¸: å¡«å æ°æ®
Step 5: åå¤é项忮µæ å°
- 对äºåé/å¤éåæ®µ,éè¦å è·åé项ç keyï¼UUIDï¼
- æ¥è¯¢å·¥ä½è¡¨ç»æè·å options å表
Step 6: å建记å½
POST /v3/app/worksheets/{worksheet_id}/rows
{
"fields": [
{
"id": "customer_name",
"value": "æéäºç§ææéå
¬å¸"
},
{
"id": "customer_type",
"value": ["74c7b607-864d-4cc4-b401-28acba2636e9"] // â ï¸ ä½¿ç¨é项key
}
],
"triggerWorkflow": true
}
å ³é®ç¹:
- â ï¸ é项忮µå¿ é¡»ç¨ key,ä¸è½ç¨æ¾ç¤ºææ¬
- â ï¸ é项忮µå³ä½¿åéä¹è¦ç¨æ°ç»æ ¼å¼
- â æ°å¼å段åå ¥æ¶ä¼ æ°å,è¯»åæ¶è¿åå符串
详ç»è§è: åè references/hap-api-usage-guide.md 第 3 è
é¶æ®µå: æ¥è¯¢ååææ°æ®
Step 7: æ¥è¯¢è®°å½å表
POST /v3/app/worksheets/{worksheet_id}/rows/list
{
"filter": {
"type": "group",
"logic": "AND",
"children": [
{
"type": "condition",
"field": "customer_type",
"operator": "eq",
"value": ["74c7b607-864d-4cc4-b401-28acba2636e9"] // 使ç¨key
}
]
},
"sorts": [{
"field": "annual_budget",
"isAsc": false
}],
"pageIndex": 1,
"pageSize": 20
}
详ç»è§è: åè references/hap-api-usage-guide.md 第 4 è
Filter çéå¨è§è âéç¹
Filter å¯¹è±¡ç»æ
åºç¡ç»æ:
Filter = {
type: 'group' | 'condition';
// type='group' æ¶çåæ®µ
logic?: 'AND' | 'OR';
children?: Filter[]; // 忡件,æå¤ä¸¤å±åµå¥
// type='condition' æ¶çåæ®µ
field?: string; // åæ®µIDæå«å
operator?: string; // æä½ç¬¦
value?: any[]; // 弿°ç»
}
è§å:
- é¡¶å±å¿
é¡»æ¯
groupç±»å - æå¤ä¸¤å±åµå¥: group â group â condition
- åä¸ group ç children å¿ é¡»ç±»åä¸è´
- group å¿
é¡»æå®
logic(AND/OR) - condition å¿
é¡»æå®
field,operator
æä½ç¬¦å®æ´å表
| æä½ç¬¦ | 说æ | éè¦value | valueæ ¼å¼ | éç¨å段 |
|---|---|---|---|---|
eq |
çäº | â | ["å¼"] |
ææç±»å |
ne |
ä¸çäº | â | ["å¼"] |
ææç±»å |
contains |
å å« | â | ["å¼"] |
Text, MultipleSelect |
notcontains |
ä¸å å« | â | ["å¼"] |
Text, MultipleSelect |
startswith |
å¼å¤´æ¯ | â | ["å¼"] |
Text |
endswith |
ç»å°¾æ¯ | â | ["å¼"] |
Text |
gt |
å¤§äº | â | ["å¼"] |
Number, Date |
gte |
大äºçäº | â | ["å¼"] |
Number, Date |
lt |
å°äº | â | ["å¼"] |
Number, Date |
lte |
å°äºçäº | â | ["å¼"] |
Number, Date |
between |
ä»äºä¹é´ | â | ["æå°å¼", "æå¤§å¼"] |
Number, Date |
isempty |
为空 | â | ä¸éè¦ | ææç±»å |
isnotempty |
ä¸ä¸ºç©º | â | ä¸éè¦ | ææç±»å |
belongsto |
å±äº | â | ["ID1", "ID2"] |
Relation, Department |
in |
å¨…ä¸ | â | ["å¼1", "å¼2"] |
ææç±»å |
concurrent |
åæ¶å å« | â | ["å¼1", "å¼2"] |
MultipleSelect |
çé示ä¾
示ä¾1: åéåæ®µçéï¼â ï¸ å¿ é¡»ä½¿ç¨ keyï¼
{
"type": "group",
"logic": "AND",
"children": [{
"type": "condition",
"field": "customer_type",
"operator": "eq",
"value": ["74c7b607-864d-4cc4-b401-28acba2636e9"] // â
使ç¨key
}]
}
// â é误: value: ["æäº¤å®¢æ·"] // ä¸è½ç¨æ¾ç¤ºææ¬!
示ä¾2: æ°å¼èå´çéï¼â ï¸ value å¿ é¡»æ¯å符串æ°ç»ï¼
{
"type": "condition",
"field": "annual_budget",
"operator": "between",
"value": ["500000", "2000000"] // â
å符串æ°ç»
}
// â é误: value: [500000, 2000000] // ä¸è½ç¨æ°å!
示ä¾3: å ³èåæ®µçéï¼â ï¸ å¿ é¡»ç¨ belongstoï¼
{
"type": "condition",
"field": "related_customer",
"operator": "belongsto", // â
å
³èåæ®µç¨ belongsto
"value": ["customer-row-id"]
}
// â é误: operator: "eq" // å
³èåæ®µä¸æ¯æ eq!
详ç»è§è: åè references/hap-api-usage-guide.md 第 4 è
åæ®µç±»åå¤çè§è
å ³é®å段类åå¤ç
1. é项忮µï¼SingleSelect/MultipleSelectï¼âââ
åå ¥: å¿ é¡»ä¼ é项 key çæ°ç»
{
"id": "customer_type",
"value": ["74c7b607-864d-4cc4-b401-28acba2636e9"] // é项key
}
读å: è¿åå å« key å value ç对象æ°ç»
{
"customer_type": [
{
"key": "74c7b607-864d-4cc4-b401-28acba2636e9",
"value": "æäº¤å®¢æ·"
}
]
}
â ï¸ å ³é®ç¹:
- å³ä½¿æ¯åé,ä¹è¦ç¨æ°ç»
["key"] - ä¸è½ä¼ æ¾ç¤ºææ¬
["æäº¤å®¢æ·"],å¿ é¡»ç¨ key - çéæ¶å¿ é¡»ä½¿ç¨ key,ä¸è½ä½¿ç¨æ¾ç¤ºææ¬
2. éä»¶åæ®µï¼Attachmentï¼â
åå ¥: æ¯æ URL å base64
{
"id": "attachments",
"type": "0", // 0=è¦ç, 1=追å
"value": [{
"name": "产åå®£ä¼ å.pdf",
"url": "https://example.com/brochure.pdf"
}]
}
读å: è¿åé件对象æ°ç»
{
"attachments": [{
"file_id": "...",
"file_name": "...",
"downloadUrl": "https://...", // â ï¸ ä½¿ç¨ downloadUrl
"file_size": 2048576
}]
}
â ï¸ éè¦æç¤º:
- éä»¶ä¸ä¼ æ¯å¼æ¥å¤ç,é常éè¦ 5-10 ç§
- API è¿åæåä¸ä»£è¡¨éä»¶å·²ä¸ä¼ 宿
- 使ç¨
downloadUrlèéurl
3. å ³èåæ®µï¼Relationï¼âââ
åå ¥: ä¼ è®°å½ ID æ°ç»
{
"id": "related_customer",
"value": ["945e6503-3823-4e91-9d84-a53f8bdd6fc5"] // è®°å½rowid
}
读å: è¿å对象æ°ç»ï¼åªå å« sid å nameï¼
{
"related_customer": [{
"sid": "945e6503-3823-4e91-9d84-a53f8bdd6fc5",
"name": "æéäºç§ææéå
¬å¸"
}]
}
è·å宿´å ³èæ°æ®:
// æ¹æ³1: 使ç¨ä¸ç¨ API
GET /v3/app/worksheets/{worksheet_id}/rows/{row_id}/relations/{field_id}
// æ¹æ³2: ä½¿ç¨ sid æ¥è¯¢ç®æ 表
POST /v3/app/worksheets/{target_worksheet_id}/rows/list
{
"filter": {
"type": "group",
"logic": "AND",
"children": [{
"type": "condition",
"field": "rowid", // â ï¸ ä½¿ç¨ç³»ç»å段 rowid
"operator": "in",
"value": ["sid1", "sid2"] // ä¼ å
¥å
³èè®°å½ç sid
}]
}
}
详ç»è§è: åè references/hap-api-usage-guide.md 第 6 è
4. æååæ®µï¼Collaboratorï¼
åå ¥: ä¼ ç¨æ· ID æ°ç»
{
"id": "owner",
"value": ["user-account-id-123"] // ç¨æ·ID,䏿¯ç¨æ·å
}
è·åç¨æ·ID:
POST /v3/users/lookup
{
"name": "å¼ ä¸" // 精确å¹é
å§å
}
5. æ°å¼å段ï¼Numberï¼
åå ¥: ä¼ æ°åç±»å
{
"id": "annual_budget",
"value": 1000000.50
}
读å: è¿åå符串
{
"annual_budget": "1000000.50"
}
â ï¸ æ³¨æ: åå ¥æ°å,读åå符串
详ç»è§è: åè references/hap-api-usage-guide.md 第 2ã3 è
triggerWorkflow åæ°è¯¦è§£ âéè¦
triggerWorkflow åæ°æ§å¶æ¯å¦å¨æ°æ®æä½æ¶è§¦åå·¥ä½è¡¨ç¸å
³ç工使µã
éç¨èå´:
- â å建记å½
- â æ¹éå建
- â æ´æ°è®°å½
- â æ¹éæ´æ°
- â å é¤è®°å½
- â æ¹éå é¤
åæ°è¯´æ:
| åæ°å¼ | 说æ | é»è®¤å¼ | 使ç¨åºæ¯ |
|---|---|---|---|
true |
触å工使µ | â æ¯ | æ£å¸¸ä¸å¡æä½,éè¦æ§è¡èªå¨åæµç¨ |
false |
ä¸è§¦å工使µ | â å¦ | æ°æ®è¿ç§»ãæ¹éåå§åãæµè¯æ°æ® |
â
åºè¯¥è®¾ç½®ä¸º true çåºæ¯:
- æ£å¸¸ä¸å¡æä½ï¼ç¨æ·æäº¤è¡¨åãæ´æ°ç¶æçï¼
- éè¦èªå¨åå¤ççæä½
â åºè¯¥è®¾ç½®ä¸º false çåºæ¯:
- æ°æ®è¿ç§»åå¯¼å ¥
- æ¹éæ°æ®åå§å
- 宿¶åæ¥ä»»å¡
- æµè¯åè°è¯
æ§è½å½±å:
triggerWorkflow: false– API ååºå¿«,é常 < 500mstriggerWorkflow: true– éè¦çå¾ å·¥ä½æµæ§è¡,å¯è½éè¦ 1-5 ç§
详ç»è¯´æ: åè references/hap-api-usage-guide.md 第 3.2 è
常è§é·é±ä¸è§£å³æ¹æ¡ âââ
é·é±1: é项忮µçéä½¿ç¨æ¾ç¤ºææ¬
é®é¢: çéåé/å¤éåæ®µæ¶è¿åç©ºç»æ
é误示ä¾:
{
"field": "customer_type",
"operator": "eq",
"value": ["æäº¤å®¢æ·"] // â 使ç¨äºæ¾ç¤ºææ¬
}
æ£ç¡®åæ³:
{
"field": "customer_type",
"operator": "eq",
"value": ["74c7b607-864d-4cc4-b401-28acba2636e9"] // â
使ç¨é项key
}
è§£å³æ¹æ¡:
- åå§åæ¶æ¥è¯¢å·¥ä½è¡¨ç»æ,ç¼åé项æ å°
- æå æ¥è¯¢ä¸æ¡è®°å½,ä»è¿åæ°æ®è·å key
- å»ºç« value â key çæ å°è¡¨
é·é±2: æ°å¼å段çéä½¿ç¨æ°åç±»å
é®é¢: æ°å¼çéæ ç»æææ¥é
é误示ä¾:
{
"field": "annual_budget",
"operator": "gt",
"value": [1000000] // â æ°åç±»å
}
æ£ç¡®åæ³:
{
"field": "annual_budget",
"operator": "gt",
"value": ["1000000"] // â
å符串æ°ç»
}
è®°å¿å£è¯: ç鿡件ç value æ°¸è¿æ¯å符串æ°ç»
é·é±3: å ³èåæ®µä½¿ç¨é误çæä½ç¬¦
é®é¢: 使ç¨é误çæä½ç¬¦çéå ³èåæ®µ
é误示ä¾:
{
"field": "related_customer",
"operator": "eq", // â å
³èåæ®µä¸æ¯æ eq
"value": ["customer-id"]
}
æ£ç¡®åæ³:
{
"field": "related_customer",
"operator": "belongsto", // â
ä½¿ç¨ belongsto
"value": ["customer-id"]
}
é·é±4: å ³èåæ®µ N+1 æ¥è¯¢é®é¢
é®é¢: å¨å表页é个æ¥è¯¢å ³èæ°æ®
é误示ä¾:
// â æ§è½ç¾é¾:100个产å = 1 + 100 = 101次请æ±
const products = await getProductList(); // 1次请æ±
for (const product of products) {
const categoryId = product.category[0].sid;
const category = await getCategoryById(categoryId); // 100次请æ±!
}
æ£ç¡®åæ³: æ¹éæ¥è¯¢
// â
æ§è½ä¼å:100个产å = 1 + 1 = 2次请æ±
const products = await getProductList(); // 1次请æ±
// æ¶éææåç±»ID
const categoryIds = new Set();
products.forEach(p => {
if (p.category && p.category.length > 0) {
categoryIds.add(p.category[0].sid);
}
});
// æ¹éæ¥è¯¢ææåç±»
const categories = await getRows('category-worksheet-id', {
filter: {
type: 'condition',
field: 'rowid',
operator: 'in',
value: Array.from(categoryIds)
}
}); // 1次请æ±
// å»ºç«æ å°
const categoryMap = {};
categories.rows.forEach(cat => {
categoryMap[cat.rowid] = cat;
});
详ç»è¯´æ: åè references/hap-api-usage-guide.md 第 7 è
æ§è½ä¼å建议
1. æ¥è¯¢ä¼å
- åç使ç¨å页: pageSize ä¸è¦è¶ è¿ 1000
- æå®è¿ååæ®µ: ä½¿ç¨ fields åæ°,åªè¿åéè¦çåæ®µ
- 使ç¨å段ID: æ¯å«åæ¥è¯¢æ§è½æ´å¥½
- é¿å è¿åº¦åµå¥: Filter åµå¥æ§å¶å¨ 2 å±ä»¥å
- åç¨è§å¾: 夿çéå¯å å建è§å¾,åæ¥è¯¢è§å¾
2. æ¹éæä½ä¼å
- æ¹éå建: 䏿¬¡æå¤ 100 æ¡
- æ¹éæ´æ°: 䏿¬¡æå¤ 100 æ¡
- å å«å ³èåæ®µ: åå°å°æ¯æ¹ 30-50 æ¡
- å å«éä»¶: 建议åç¬å¤ç,ä¸è¦æ¹é
- æ¹æ¬¡é´å»¶è¿: æ¯æ¹é´é 1-2 ç§
3. å ³èåæ®µä¼å
- åå°åµå¥æ¥è¯¢: ä½¿ç¨ get_record_relations API 䏿¬¡è·å
- æ¹éæ¥è¯¢: é¿å N+1 æ¥è¯¢é®é¢
- ç¼åå ³èæ°æ®: é¢ç¹è®¿é®çå ³èæ°æ®å¯ç¼å
- æ§å¶ showFields: åªæ¾ç¤ºå¿ è¦å段,åå°æ°æ®é
详ç»è¯´æ: åè references/hap-api-usage-guide.md 第 8 è
ð¤ AI å©æä½¿ç¨æå
å½ç¨æ·éè¦è°ç¨ HAP V3 API æ¶ï¼AI 婿åºè¯¥éµå¾ªä»¥ä¸ååï¼
1. èªå¨æåé´æå¯é¥
ä¼å 级顺åºï¼
-
ä¼å ä» MCP é ç½®æåï¼æ¨èï¼
- 读å Cursor å ¨å±è®¾ç½®æä»¶
- æ¥æ¾
hap-mcp-*é ç½® - ä» URL 䏿å
HAP-AppkeyåHAP-Sign - 妿æ¾å°å¤ä¸ªé ç½®ï¼è¯¢é®ç¨æ·ä½¿ç¨åªä¸ªåºç¨
-
ç¨æ·æå¨æä¾
- å¦ææªæ¾å° MCP é ç½®ï¼æç¤ºç¨æ·æä¾ Appkey å Sign
- æå¼å¯¼ç¨æ·å é ç½® MCP
-
å¼å¯¼é ç½® MCP
- å¦æç¨æ·æ MCP é 置信æ¯ï¼å¸®å©ç¨æ·é ç½®å° Cursor
- ç¶åä»é ç½®ä¸æåå¯é¥
2. é 置请æ±å¤´
æåå°å¯é¥åï¼èªå¨é 置请æ±å¤´ï¼
const headers = {
'Content-Type': 'application/json',
'HAP-Appkey': extractedAppkey, // ä» MCP é
ç½®æå
'HAP-Sign': extractedSign // ä» MCP é
ç½®æå
};
3. å¤çå¤ä¸ªåºç¨
å¦æç¨æ·é ç½®äºå¤ä¸ª HAP MCPï¼
- æç¡®æå®åºç¨å: å¦æç¨æ·æå°å ·ä½åºç¨åï¼ä½¿ç¨å¯¹åºçé ç½®
- 询é®ç¨æ·: å¦ææªæå®ï¼ååºææé ç½®çåºç¨ï¼è®©ç¨æ·éæ©
- é»è®¤ä½¿ç¨: å¦æåªæä¸ä¸ªé ç½®ï¼ç´æ¥ä½¿ç¨
4. é误å¤ç
- é ç½®ä¸åå¨: æç¤ºç¨æ·å é ç½® MCP ææå¨æä¾å¯é¥
- URL è§£æå¤±è´¥: æ£æ¥ URL æ ¼å¼æ¯å¦æ£ç¡®
- åæ°ç¼ºå¤±: æ£æ¥ Appkey å Sign æ¯å¦é½åå¨
- æéé®é¢: å¦ææ æ³è¯»åé ç½®æä»¶ï¼æç¤ºç¨æ·æ£æ¥æä»¶æé
5. å®é æä½ç¤ºä¾
åºæ¯: ç¨æ·è¯´”帮æè°ç¨ HAP API æ¥è¯¢æ°æ®”
AI æä½æµç¨:
- 读å Cursor å
¨å±è®¾ç½®æä»¶
~/Library/Application Support/Cursor/User/settings.json - æ¥æ¾
mcpServersä¸çhap-mcp-*é ç½® - 妿æ¾å°é ç½®ï¼ä» URL 䏿å Appkey å Sign
- 妿æ¾å°å¤ä¸ªé ç½®ï¼è¯¢é®ç¨æ·ä½¿ç¨åªä¸ªåºç¨
- ä½¿ç¨æåçå¯é¥é ç½® API 请æ±å¤´
- æ§è¡ API è°ç¨
åºæ¯: ç¨æ·æä¾äº MCP é 置信æ¯
AI æä½æµç¨:
- å 帮å©ç¨æ·å° MCP é 置添å å° Cursor å ¨å±è®¾ç½®æä»¶
- ç¶åä»é ç½®ä¸æå Appkey å Sign
- ä½¿ç¨æåçå¯é¥è¿è¡åç» API è°ç¨
æä½³å®è·µ
1. åå§åé¶æ®µ
å¿ åäºé¡¹:
- æ¥è¯¢ææå·¥ä½è¡¨ç»æ
- ç¼åææé项忮µç key-value æ å°
- ç¼åå·¥ä½è¡¨ ID ååæ®µ ID
- 建ç«ç¨æ·å§åâID æ å°
示ä¾ä»£ç :
// 1. è·åå·¥ä½è¡¨ç»æ
const structure = await getWorksheetStructure(worksheetId);
// 2. æåé项忮µæ å°
const optionMaps = {};
structure.fields.forEach(field => {
if (field.type === 'SingleSelect' || field.type === 'MultipleSelect') {
optionMaps[field.id] = {};
field.options.forEach(opt => {
optionMaps[field.id][opt.value] = opt.key; // value â key
});
}
});
// 3. ä½¿ç¨æ¶æ¥æ¾key
const customerTypeKey = optionMaps['customer_type']['æäº¤å®¢æ·'];
2. æ¥è¯¢é¶æ®µ
建议:
- ä¼å 使ç¨å段 ID è䏿¯å«å
- é项忮µå¿ é¡»ç¨ key,æå转æ¢
- æ°å¼å段 value ç¨å符串
- å ³èåæ®µç¨ belongsto æä½ç¬¦
- åç设置 pageSizeï¼å»ºè®® 100-500ï¼
3. åå ¥é¶æ®µ
æ£æ¥æ¸ å:
- é项忮µ value æ¯æ°ç»æ ¼å¼
- é项忮µä¼ çæ¯ key 䏿¯ value
- æ°å¼åæ®µä¼ æ°åç±»å
- å ³èåæ®µä¼ çæ¯ rowid
- æååæ®µä¼ çæ¯ accountId
- éä»¶åæ®µè®¾ç½®äº type åæ°
4. é误å¤ç
常è§é误ç :
error_code: 1– æåerror_code: -1– 失败,æ¥ç error_msgerror_code: 4– æéä¸è¶³error_code: 10– åæ°é误
建议: ææ API è°ç¨é½è¦æ£æ¥ error_code å success
详ç»è¯´æ: åè references/hap-api-usage-guide.md 第 9 è
å¸¸ç¨ API 端ç¹éæ¥
| åºæ¯ | API ç«¯ç¹ | å ³é®åæ° |
|---|---|---|
| å建工ä½è¡¨ | POST /v3/app/worksheets |
fields |
| æ·»å åæ®µ | POST /v3/app/worksheets/{id} |
addFields |
| åå»ºè®°å½ | POST /v3/app/worksheets/{id}/rows |
fields |
| æ¹éå建 | POST /v3/app/worksheets/{id}/rows/batch |
rows |
| æ¥è¯¢è®°å½ | POST /v3/app/worksheets/{id}/rows/list |
filter, sorts |
| æ´æ°è®°å½ | POST /v3/app/worksheets/{id}/rows/{row_id} |
fields |
| æ¹éæ´æ° | PUT /v3/app/worksheets/{id}/rows/batch |
rowIds, fields |
| å é¤è®°å½ | DELETE /v3/app/worksheets/{id}/rows/{row_id} |
permanent |
| æ¹éå é¤ | DELETE /v3/app/worksheets/{id}/rows/batch |
rowIds, permanent |
| éè§åæ | POST /v3/app/worksheets/{id}/rows/pivot |
rows, values |
| æ¥æ¾ç¨æ· | POST /v3/users/lookup |
name |
| æ¥æ¾é¨é¨ | POST /v3/departments/lookup |
name |
| è·åå°åº | POST /v3/regions |
search, id |
åèèµæº
æ ¸å¿ææ¡£
references/hap-api-usage-guide.md– HAP V3 API 使ç¨è§è宿´æå- å¿«éå¼å§ – API ä½¿ç¨æµç¨
- å建工ä½è¡¨è§è
- åæ®µç±»ååæ°è¯¦è§£
- å建/æ´æ°è®°å½è§èï¼triggerWorkflow 详解ï¼
- æ¥è¯¢çéè§èï¼Filter å¯¹è±¡ç»æãæä½ç¬¦å表ï¼
- æ°æ®éè§åæè§è
- å ³èåæ®µå®æ´æå
- 常è§é·é±ä¸è§£å³æ¹æ¡
- æ§è½ä¼å建议
- æä½³å®è·µæ»ç»
å¨çº¿ææ¡£
ç¸å ³æè½
- HAP ååç«¯é¡¹ç®æå»ºæå – ä½¿ç¨ HAP ä½ä¸ºæ°æ®åºæå»ºç¬ç«ç½ç«
- HAP MCP ä½¿ç¨æå – äºè§£å¦ä½ä½¿ç¨ HAP MCP è¿è¡åºç¨ç®¡ç
- HAP è§å¾æä»¶å¼åæå – å¼å HAP èªå®ä¹è§å¾æä»¶
å ³é®æ¦å¿µéæ¥
åæ®µç±»å (type):
- åºç¡:
Text,Number,Date,Time - éæ©:
SingleSelect,MultipleSelect - å
³ç³»:
Relation,Collaborator,Department - å
¶ä»:
Attachment,Rating
çéæä½ç¬¦ (operator):
- æ¯è¾:
eq,ne,gt,gte,lt,lte - ææ¬:
contains,startswith,endswith - èå´:
between,in - å
³è:
belongsto - 空å¼:
isempty,isnotempty
subType åæ°:
- Collaborator:
0=åé,1=å¤é - Relation:
1=åæ¡,2=夿¡ - Time:
1=æ¶:å,6=æ¶:å:ç§ - Date:
3=å¹´ææ¥,6=å¹´ææ¥æ¶åç§
éè¯¯ææ¥æ¸ å
çéæ ç»æ:
- é项忮µæ¯å¦ç¨äº key è䏿¯ value?
- æ°å¼å段 value æ¯å¦ç¨äºå符串?
- å ³èåæ®µæ¯å¦ç¨äº belongsto?
- Filter åµå¥æ¯å¦è¶ è¿ 2 å±?
- åæ®µ ID æ¯å¦æ£ç¡®?
å建/æ´æ°å¤±è´¥:
- å¿ å¡«åæ®µæ¯å¦é½æä¾äº?
- å ³èåæ®µç dataSource æ¯å¦åå¨?
- é项忮µç key æ¯å¦ææ?
- æååæ®µç accountId æ¯å¦ææ?
- æ°å¼å段æ¯å¦è¶ åºèå´?
æ°æ®å¼å¸¸:
- éä»¶æ¯å¦çå¾ äº 5-10 ç§?
- æ¥æç²¾åº¦ subType æ¯å¦æ£ç¡®?
- å ³èè®°å½æ¯å¦å·²å é¤?
æè½çæ¬: v2.0
æåæ´æ°: 2026-01-11
åºäº: HAP API V3
详ç»è§è: åè references/hap-api-usage-guide.md