【问题标题】:JsonAPI SuiteCRM pulling back multiple recordsJsonAPI SuiteCRM 拉回多条记录
【发布时间】:2021-02-08 04:04:18
【问题描述】:

我目前正在执行 suitecrm 实施,我的客户需要以编程方式撤回属于特定潜在客户列表的所有潜在客户。

在 suitecrm 中获取潜在客户列表很容易

GET:/module/api/v8/Prospects

获取潜在客户列表也很简单

GET:/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(特别是 suitecrm)是否可以一次性拉回所有相关记录(完整记录,而不仅仅是 ID),而不是遍历数组并逐个获取请求一个?

我确实使用了 filter 参数进行了测试,但由于返回数据的可变长度性质,它似乎并没有起到作用,并且让我感到害怕。

【问题讨论】:

    标签: json-api suitecrm


    【解决方案1】:

    您的问题包含两部分:

    1. 在 JSON:API 规范中链接相关资源
    2. 在 SuiteCRM 中实现 JSON:API 规范

    让我一个接一个地回答。

    在 JSON:API 规范中链接相关资源

    JSON:API 规范定义了关系链接:

    1. 关系链接
    2. 相关资源链接

    它们可能包含在relationship objectlinks 成员中。 self 键提供关系链接。 related 键提供相关资源链接。

    关系链接被定义为“关系本身的链接。此链接允许客户端直接操作关系。[...] 成功获取后,此链接返回相关资源的链接作为其主要数据。” (Source)

    定义中提到的Resource Linkage是相关资源(具有一关系)或资源(具有多关系)的Resource Identifier Objects。资源标识符对象是特定资源的typeid 的唯一组合,用于标识它。

    Related Resource Link“提供对在关系中链接的资源对象的访问。获取时,相关资源对象将作为响应的主要数据返回。”

    总结GET操作:

    1. Relationship Links 提供typeid 的相关资源。
    2. Related Resource Links 提供了相关资源的完整资源对象。

    为特定关系提供关系链接和相关资源链接取决于两者的实现,只有其中一个或没有。

    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 为11a71596-83e7-624d-c792-5ab9006dd493Account 的资源对象包括AOS_Contracts 关系的相关资源链接。是/V8/module/Accounts/11a71596-83e7-624d-c792-5ab9006dd493/relationships/aos_contracts

    您提供的回复与我对相关资源链接的预期不同。它不包括Prospect 资源的任何字段。它看起来像带有附加自链接的资源标识符对象。

    严格来说,我认为这并没有错。 JSON:API 规范默认允许服务器在响应中仅包含所有字段的子集。该子集可能因端点而异。但这至少非常罕见。

    在这种情况下,您应该能够使用Sparse Fieldsets 功能请求包含特定字段。我不知道 SuiteCRM 中Prospect 资源的字段。但是假设它有一个name 属性,您可以通过将这些查询参数添加到相关资源链接:?fields[Prospect]=name 来请求包含它(并且只包含它)。

    【讨论】:

    • 我认为您误解了这个问题。问题是如何在没有迭代的情况下提取子记录,即检索由父 ID 过滤的对象列表。这似乎不可能(至少使用suitecrm)。 JSON:API 中有一个过滤器属性,但是你赌的是永远不会最大化 URL 长度。我最终通过放弃 JSON:API 并为这个特定的数据集直接访问数据库来解决它。
    • 我试图回答这个问题。相关资源链接应该为您提供给定关系的所有资源对象的列表。如果一个实现返回一个资源标识符对象列表(仅限typeid),这似乎是一个错误。如果您可以在他们的响应中包含相关请求,我可能会更清楚地指出 SuiteCRM 是否以及如何以一种奇怪的方式实现 JSON:API 规范。或者您是否知道我可以使用任何公共 SuiteCRM API 来测试自己?
    • 假设您的问题中提到的/Api/V8/module/ProspectLists/a8f704d4-c25b-53e6-a7fc-6005b93835cd/relationships/prospects URL 在关系中作为related 链接给出,并且它返回您问题中包含的有效负载,我认为它至少是一个非常奇怪的实现JSON:API 规范。它可能不会一字不差地违反规范。但它确实违反了它的意图。您也许可以使用 SuiteCRM 的seem to be supported 的稀疏字段集来完成该实施。
    • 我不知道任何公开的开放 API,我将其安装在本地进行测试。我同意实施很奇怪。我测试了稀疏字段集,似乎它们只允许对当前集中包含的数据进行字段选择,这意味着您无法访问相关对象。我想我找到了一个可以接受的解决方法。不过感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多