请求的资源在 Salesforce 中不存在 [错误]。Salesforce 有什么问题?

Pav*_*hyn 6 api rest salesforce soql salesforce-lightning

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

我对以下 SObject 观察到相同的情况:

TaskStatus
TaskPriority
SolutionStatus
PartnerRole
OrderStatus
FlowDefinitionView
FieldSecurityClassification EntityDefinition
ContractStatus
CaseStatus

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

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

小智 4

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

  1. 带有“000”的记录在 Salesforce 中可以被识别为EmptyKey,通常指空关系值。

联系人是业务机会上的查找字段,下面的查询将返回相同的计数。

SELECT count() FROM opportunity WHERE contactId = null
SELECT count() FROM Opportunity WHERE contactId = '000000000000000AAA'
Run Code Online (Sandbox Code Playgroud)
  1. 参考对象权限中的记录(以“000”开头),与空键几乎没有什么不同,并且可以在博客中找到 ids 的详细信息

Salesforce 密钥前缀“000”背后的奥秘

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

设置responseIds - 从第一个请求返回的响应记录Ids,并处理这些Ids以过滤掉第二个请求的“000”Ids。

String prefix = Schema.SobjectType.ObjectPermissions.getKeyPrefix();
for(String str : responseIds){
    if(!str.subString(0,3).contains(prefix)){
        responseIds.remove(str);        
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 最近查看的对象不能直接使用。该对象中的 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

  1. 尽管我们为每个标准选项列表都有单独的对象,但它们都共享相同的键前缀/对象类型。以下代码将删除所有针对选项列表对象的请求(任务状态、案例状态、解决方案状态...)

    for(Id str : responseIds){
         if(Id.getsobjecttype() == 'Picklistmaster'){
             responseIds.remove(str);        
         }
     }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 对于Loginhistory,超过6个月的记录将被salesforce内部删除。因此,如果您运行 2 个请求(查询请求、稍后的数据请求),并且如果这 2 个请求恰好位于 Salesforce 维护时段之间,则在您的第二个请求期间,引用的 ID 已从组织中删除,因此会出现错误。并确保您具有管理用户权限。