问题描述
我目前正在执行 Suitecrm 实施,我的客户要求以编程方式撤回属于特定潜在客户列表的所有潜在客户。
在suitecrm中获取潜在客户列表很容易
获取:/module/api/v8/Prospects
获取潜在客户列表也很简单
获取:/module/api/v8/Prospect_Lists
但是,在JSON API Spec中,关系是通过调用一个API为你提供相关对象的列表而存在的,例如 获取:/Api/V8/module/ProspectLists/a8f704d4-c25b-53e6-a7fc-6005b93835cd/relationships/prospects 返回与 Prospect_List 相关的潜在客户 ID 数组。 示例响应:
{
{
"data": [
{
"type": "Prospect","id": "9c3d7edf-9679-eff3-9ff0-60197fe7af68","links": {
"self": "V8/module/Prospect/9c3d7edf-9679-eff3-9ff0-60197fe7af68"
}
},{
"type": "Prospect","id": "d4ab2b49-c95d-9a64-4770-601c2b658adf","links": {
"self": "V8/module/Prospect/d4ab2b49-c95d-9a64-4770-601c2b658adf"
}
},]
}
我的问题是,使用 JSON Api(特别是suitcrm)是否可以一次性拉回所有相关记录(完整记录,而不仅仅是 ID),而不是遍历数组并逐个获取请求一个?
我确实使用过滤器参数进行了测试,但由于返回数据的可变长度性质,该参数似乎并没有起到作用,而且还是让我感到害怕。
解决方法
你的问题包含两部分:
- 在 JSON:API 规范中链接相关资源
- 在 SuiteCRM 中实现 JSON:API 规范
让我一个接一个地回答。
在 JSON:API 规范中链接相关资源
JSON:API 规范定义了关系的链接:
- 关系链接
- 相关资源链接
它们可能包含在 relationship object 的 links
成员中。 self
键提供关系链接。 related
键提供相关资源链接。
关系链接被定义为“关系本身的链接。此链接允许客户端直接操作关系。[...]成功获取后,此链接返回相关资源的链接作为其主要数据.” (Source)
定义中提到的Resource Linkage是相关资源(有一对关系)或资源(有多关系)的Resource Identifier Objects。资源标识符对象是特定资源的 type
和 id
的唯一组合,用于标识它。
A Related Resource Link“提供对关系中链接的资源对象的访问。获取时,相关资源对象将作为响应的主要数据返回。”
总结 GET
操作:
- 关系链接提供
type
和id
的相关资源。 - 相关资源链接提供相关资源的完整资源对象。
由关系链接和相关资源链接两者的实现决定,为特定关系提供,仅提供一个或没有。
在 SuiteCRM 中实现 JSON:API 规范
我自己没有使用 SuiteCRM API 的经验。提供的所有信息均基于公开文档 Suite CRM API V8 和您的问题中提供的信息。
SuiteCRM 提供了获取单个资源的请求响应示例:
{
"data": {
"type": "Account","id": "11a71596-83e7-624d-c792-5ab9006dd493","attributes": {
"name": "White Cross Co","account_type": "Customer"
},"relationships": {
"AOS_Contracts": {
"links": {
"related": "/V8/module/Accounts/11a71596-83e7-624d-c792-5ab9006dd493/relationships/aos_contracts"
}
}
}
}
}
ID 为 Account
的 11a71596-83e7-624d-c792-5ab9006dd493
的资源对象包括 AOS_Contracts
关系的相关资源链接。它是 /V8/module/Accounts/11a71596-83e7-624d-c792-5ab9006dd493/relationships/aos_contracts
。
您包含的响应与我对相关资源链接的期望不同。它不包括 Prospect
资源的任何字段。它看起来像带有附加自链接的资源标识符对象。
严格来说,我不认为这是错误的。默认情况下,JSON:API 规范允许服务器在响应中仅包含所有字段的子集。该子集可能因端点而异。但至少非常罕见。
在这种情况下,您应该能够使用 Sparse Fieldsets 功能请求包含特定字段。我不知道 SuiteCRM 中 Prospect
资源的字段。但假设它具有 name
属性,您可以通过将这些查询参数添加到相关资源链接:?fields[Prospect]=name
来请求包含它(并且仅包含它)。