如何通过REST API调用DAML fetchByKey获取合约ID与模板ID?
通过DAML REST API获取合约ID与模板ID
替代fetchByKey的REST实现方案
DAML REST API没有直接映射fetchByKey的端点,但可以通过合约搜索接口实现相同逻辑:根据你定义的合约键(Id+name)过滤目标合约,提取所需的contractId和templateId。
步骤1:确认合约键的定义
首先保证你的DAML模板已将Id和name设为合约键,示例模板代码:
template TargetTemplate with owner: Party id: Text name: Text where signatory owner key (id, name) : (Text, Text) maintainer key._1
步骤2:调用REST搜索接口
使用GET /v1/contracts/search端点,通过查询条件匹配合约键:
- 请求头需携带
Authorization: Bearer <你的令牌>和Content-Type: application/json - 请求体传入匹配参数(推荐用请求体而非URL参数,避免编码问题):
{ "templateIds": ["<你的模板全限定名>"], // 例如:"MyPackage:MyModule:TargetTemplate" "query": { "id": "<传入的Id参数>", "name": "<传入的name参数>" }, "includeArchived": false }
步骤3:解析响应提取字段
接口返回的result数组中,每个合约对象包含目标字段:
contractId: 合约的唯一标识templateId: 合约所属模板的全限定ID
示例响应片段:
{ "result": [ { "contractId": "2d5f8c7a-1b3e-4c5d-8a7b-6f4d2c1e8a3b", "templateId": "MyPackage:MyModule:TargetTemplate", "arguments": { /* 合约其他参数 */ } } ] }
关键注意事项
- 因为合约键是唯一的,响应数组只会有一个结果,直接取第一个元素即可
- 必须指定
templateIds缩小查询范围,否则会遍历账本所有合约,严重影响性能 - 调用者必须拥有该合约的读取权限,否则会返回空列表或权限错误
内容的提问来源于stack exchange,提问作者Logical Thinker
相关产品推荐
相关产品推荐

