请求的资源在 Salesforce 中不存在 [错误]。 Salesforce 出了啥问题?

Posted

技术标签:

【中文标题】请求的资源在 Salesforce 中不存在 [错误]。 Salesforce 出了啥问题?【英文标题】:The requested resource does not exist [error] in Salesforce. What is wrong with Salesforce?请求的资源在 Salesforce 中不存在 [错误]。 Salesforce 出了什么问题? 【发布时间】:2020-09-13 19:14:42 【问题描述】:

我执行 SOQL 请求以获取 SObject 'ObjectPermissions' 的所有可用记录 ID。 然后我使用对GET /services/data/v48.0/sobjects/ObjectPermissions/id 的请求来获取特定记录的所有必要信息。 正如您在第一张图片中看到的,我收到了总共 960 条记录的回复。 问题是我无法获得 285 个条目的信息。 以下是我收到的 285 个答案示例: 我突出显示了该记录的标识符。也许这个 id 是错误的。

我观察到以下 SObjects 相同:

任务状态 任务优先 解决方案状态 合作伙伴角色 订单状态 流定义视图 领域安全分类 实体定义 合同状态 案例状态

我可以使用常规对象(例如,事件、任务和登录历史记录)在不同的 Salesforce 组织中观察到相同的行为。但这种行为并非总是在每个组织中都可以重现。

是 Salesforce 做错了什么还是我不明白什么?

【问题讨论】:

【参考方案1】:

根据您的错误描述和屏幕截图,我假设您是通过编程方式(Apex、Python、Java...)进行的,并且您的第一个请求(数据提取、/Query?q)之间没有时间延迟=) ,响应和第二个请求(基于ID的记录的详细信息,/sobjects/ObjectPermissions/id)

    带有'000'的记录在Salesforce中可以被识别为EmptyKeys,一般指的是空关系值。

Contact 是 Opportunity 上的查找字段,下面的查询将返回相同的计数。

SELECT count() FROM opportunity WHERE contactId = null
SELECT count() FROM Opportunity WHERE contactId = '000000000000000AAA'
    关于 Object 权限中的记录(以 '000' 开头),与 Empty 键几乎没有区别,id 的细分可以在博客中找到

Mystery Behind The Salesforce Key Prefix '000'

    在上述场景中,我们无法在 Metadata API 查询中过滤掉这些对象,但是我们可以在 APEX 代码中发送第二个请求之前过滤记录。

设置 responseIds - 从 First Request 返回的响应记录 Id 并处理 Id 以过滤掉第二个请求的 '000' Id。

String prefix = Schema.SobjectType.ObjectPermissions.getKeyPrefix();
for(String str : responseIds)
    if(!str.subString(0,3).contains(prefix))
        responseIds.remove(str);        
    

    RecentlyViewed 对象不能直接使用。此对象中的 ID 不是属于最近查看对象的 ID,而是实际记录 ID。 因此,如果您打算从此对象访问记录,则需要从最近查看的对象中获取 Id,然后解码 keyprefix 以获得正确的 sObject 名称,然后以这种方式使用它 /sobjects/decodedSobjectName/ID

或者您也可以使用 /services/data/v48.0/recent(有关详细信息,请参阅 Salesforce 文档)

https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_recent_items.htm

    虽然我们为每个标准选项列表设置了单独的对象,但它们都共享相同的 keyprefix/objectType。以下代码将删除所有指向选项列表对象(任务状态、案例状态、解决方案状态...)的请求

    for(Id str : responseIds)
         if(Id.getsobjecttype() == 'Picklistmaster')
             responseIds.remove(str);        
         
     
    

    对于 Loginhistory,超过 6 个月的记录将由 salesforce 内部删除。因此,如果您运行 2 请求(查询请求,稍后的数据请求)并且如果这 2 请求恰好位于 Salesforce 维护窗口之间,那么在您的第二个请求期间,引用的 id 已经从组织中删除,因此出现错误。并确保您拥有管理用户权限。

【讨论】:

【参考方案2】:

TL;DR - 我不会担心这些。

    那个 ID 看起来是假的。没有合适的对象具有 000 键前缀。 (网上有很多关于“已知密钥前缀”的博客文章,但请注意时间戳,几乎每个版本都会添加新对象,因此内容可能会过时)。 ObjectPermissions 应以110 为前缀。

    Id i = '000000003guy001AAA';
    System.debug(i.getSobjectType());
    // System.SObjectException: Cannot locate Apex Type for ID: 000000003guy001AAA
    

    Daniel Ballinger 的博文很古老但很精彩:http://www.fishofprey.com/2011/09/obscure-salesforce-object-key-prefixes.html。他确实列出了键“000”的条目,它指向他的另一个帖子:http://www.fishofprey.com/2011/06/salesforce-empty-key-id.html

    您列出的表格是真正的表格,“但”其中大多数是用于内部管理,它们是“类固醇的选择列表”。

    CaseStatus 值得拥有它自己的表,因为更改状态具有标记案例已关闭的副作用。 PartnerRole 很特别,因为它包含用于双向映射的反向合作伙伴角色。您不能真正授予这些权限的读取/创建/编辑/删除权限,至少对于ObjectPermissions 的含义而言是这样。这将是配置文件/权限集上的复选框,但其中大部分将被“配置应用程序”覆盖。

    OpportunityStageCampaignMemberStatus 是否有同样的问题?

    LoginHistory 不是选择列表,但可能受“管理用户”保护,EntityDefinition 嗯...可能是“查看设置和配置”。

    我的直觉是 SF 包含这些条目是为了完整性,但如果父个人资料/权限是特殊的,它们是空白的。权限可以始终启用(系统管理员、任何其他带有“修改所有数据”和“作者 Apex”的配置文件也可能)或始终禁用(例如被许可证阻止)。我所说的阻止是指客户社区许可证之类的情况-您无法授予对机会或潜在客户的访问权限-复选框根本不存在。与平台用户(仅访问 10 个自定义对象)、Chatter Plus 许可证(或任何正确名称)类似。因此,如果无法更改它 - 为什么还要给它一个真实的 ID。

    当你运行这个时你会得到什么?

    SELECT Id, SobjectType, Parent.Profile.Name, PermissionsRead
    FROM ObjectPermissions
    ORDER BY Id
    

是的,它的解释有点弱,但请记住 ObjectPermissions 和 FieldPermissions 仍然相对较新。一个真实的来源是将配置文件视为 XML(元数据 API)或运行“描述”调用(Apex、SOAP API、REST API - 仅适用于当前用户)。 FieldPermissions 没有对象上所有字段的条目(Id、CreatedById、SystemModstamp...),没有人抱怨。这些可查询的对象是一种快捷方式,但它们有局限性。

【讨论】:

"运行此程序会得到什么?"我得到了与您在上面发布的相同的答案。 “那个 ID 看起来很假。没有正确的对象具有 000 键前缀。”您的意思是,以 000 键前缀开头的每条记录都是参考,应该跳过。我是对的?我正在使用带有系统管理员配置文件的开发人员版本,并且选中了“ModifyAllData”复选框。下面的记录呢? FieldSecurityClassification/01J1v00000ZvcxnEAB LoginHistory/0Ya1v00005xdN8cCAE PermissionSetTabSetting/01P0Y00004NE7YQUA1 最近查看/0010Y00000dLzyvQAC 我也遇到了同样的错误。 相同,跳过它们。这些表并不是真正“允许的”,最终用户无法查看和编辑其中的记录。一些内部 SF 原因,为什么他们有行。 FieldSecurityClassification 您不作为记录进行编辑,它会在您在设置中编辑字段时显示,它可以让您放置 PII、HIPAA 等内容。 RecentlyViewed 是一个辅助表,其中包含来自不同表的迷你视图/记录的小副本 - 同样,您无法真正编辑其中的任何内容,您将编辑原始帐户等。即使您的目标是备份整个系统——你不能写(恢复)这些。 这样的对象可以过滤掉吗? (如果是这样,我该如何处理?)我能否从对 GET /services/data/v48.0/sobjects/name/describe 的请求中找到一些有用的信息,以便能够区分一些内部 sobjects(系统、蹩脚的等。我不知道如何正确命名它们)? SELECT QualifiedApiName, IsEverCreatable FROM EntityDefinition WHERE IsEverCreatable = false 可能是一个好的开始,检查它是否接近您的列表并尝试来自developer.salesforce.com/docs/atlas.en-us.api_tooling.meta/… 的东西? IsFlsEnabled = false?可以正常查询,不需要Tooling API。但是,如果存在特定于个人资料或记录的失败将无济于事(就像您提到的事件,那是特定的记录?也许它被设置为私有或同时被删除)【参考方案3】:

根据错误响应和您的描述,您正在使用的客户端(Workbench?)之间似乎存在连接错误,该客户端正在尝试访问您的 Salesforce 组织。这就是我解决问题的方法-

    与在其他地方请求数据(DataLoader、VS 代码、开发控制台/内部访问)相比,检查这是否是特定于外部客户端(工作台)的问题。如果您可以通过其他方法访问它,那么您可以确认它是与您的组织的特定连接。 确认配置文件/权限集对对象和字段的访问(听起来很明显,但您会感到惊讶)。即使是单个字段级别的访问也可能会干扰您检索记录(即使您是系统管理员,这并不意味着您始终对每个字段都具有字段级别安全性)。 确认您在客户端上运行的用户对您请求的记录具有完全共享访问权限。 这对于检查是否有一些记录返回某个对象的查询尤其重要,但不是全部。

我必须获取更多详细信息才能进一步提供帮助,但确认上述详细信息将有很长的路要走。要点是,如果您可以访问对象中的某些记录,但不能访问其他记录,那么它告诉我您对组织具有身份验证,具有对象访问权限,但可能没有完全共享或字段级安全访问权限特定的运行用户。

【讨论】:

我会尽量回答你的问题 1. 这绝对不是连接问题。我可以使用邮递员和我的自定义脚本重现此行为。 2. 我的系统管理员配置文件对每个对象的所有字段都具有“读取权限”。 3. 这是我需要在用户资料中检查的内容吗?因为我在那里找不到与“完全共享访问”相对应的字段。

以上是关于请求的资源在 Salesforce 中不存在 [错误]。 Salesforce 出了啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

react-redux 桌面应用程序中请求的资源错误中不存在 Access-Control-Allow-Origin' 标头

AWS SAM:请求的资源响应中不存在“Access-Control-Allow-Origin”标头

Salesforce 沙盒中不提供社区选项

spring 5 webflux 功能端点请求中不存在访问控制源头

使用二头肌的 Azure Functionapp 部署:请求正文中不存在属性对象

json解析中,解析的名称key在json中不存在,会报错吗,还是返回空对象