函数无法调用Foundry内部API?求可用TypeScript API示例与方案
Foundry内部API调用失败原因及TypeScript实现方案
常见失败原因
- 权限不足:Foundry API要求调用身份具备对应资源的权限(如数据集读写、函数执行权限),若函数运行身份无权限会直接报错。
- 路径错误:内部API无需完整域名,需使用相对路径或内部服务路径,误用公开API的完整域名会导致失败。
- 认证冲突:内部调用无需手动传递Bearer Token,Foundry会自动注入身份上下文,手动添加认证头反而会引发冲突。
- 前端CORS限制:若在前端代码中调用,可能触发CORS,但后端函数调用不存在此问题。
TypeScript内部API调用示例
Foundry官方提供了TypeScript SDK,可直接导入使用,简化调用流程:
1. 依赖配置
在函数的package.json中添加官方SDK依赖:
{ "dependencies": { "@foundry/functions-api": "^1.0.0", "@foundry/rest-api-client": "^1.0.0" } }
2. 数据集API调用示例(读取记录)
import { FoundryRestApiClient } from "@foundry/rest-api-client"; import { FunctionExecutionContext } from "@foundry/functions-api"; export async function fetchDatasetRecords(context: FunctionExecutionContext): Promise<any[]> { // 初始化客户端,自动继承当前函数的执行身份 const client = await FoundryRestApiClient.create(context); // 替换为你的数据集RID和视图RID const targetDatasetRid = "ri.foundry.main.dataset.your-dataset-rid"; const targetViewRid = "ri.foundry.main.dataset.view.your-view-rid"; const recordsResponse = await client.datasets.records.getRecords({ datasetRid: targetDatasetRid, viewRid: targetViewRid, limit: 100 }); return recordsResponse.data; }
3. 通用内部API调用示例
如果需要调用非数据集类的内部API,可使用通用请求方法:
import { FoundryRestApiClient } from "@foundry/rest-api-client"; import { FunctionExecutionContext } from "@foundry/functions-api"; export async function callCustomInternalApi(context: FunctionExecutionContext): Promise<any> { const client = await FoundryRestApiClient.create(context); // 内部调用使用相对路径,示例为调用另一函数的执行API const apiResponse = await client.request({ method: "POST", url: "/functions/api/v1/functions/ri.foundry.main.function.target-function-rid/execute", data: { input: { param1: "value1", param2: "value2" } } }); return apiResponse.data; }
推荐实践
- 优先使用官方SDK:
@foundry/rest-api-client封装了认证、路径处理、错误捕获等逻辑,比手动写fetch更稳定可靠。 - 校验权限配置:在Foundry控制台中,确认函数所在项目拥有目标资源的权限,且函数执行身份(默认是项目服务账户)已被授予对应权限。
- 日志调试:在函数中添加日志输出,打印请求状态码和错误信息(如
console.error("API调用失败:", response.status, response.data)),快速定位问题。 - 避免硬编码RID:通过函数参数传入RID,或使用Foundry的数据集绑定功能,让函数直接关联目标资源,减少硬编码维护成本。
内容的提问来源于stack exchange,提问作者Max Magid
相关产品推荐
相关产品推荐

