Salesforce:通过 REST API 从自定义对象中的 RFT 字段检索图像

Salesforce: retrieve images via REST API from RFT fields in custom objects

如何通过其 REST API 从 Salesforce (SF) 检索图像,这些图像作为链接嵌入到自定义对象的 RTF 字段中?

我们的目标是通过其 REST API 从 SF 中提取信息,以生成 Word 格式的报告。所以我们需要运行查询到包含相关信息的SF自定义对象。通常,我们希望从一组自定义对象中获取此信息。

其中一个自定义字段包含一个 RTF 字段,其中包含 link 相关图像。在 SF UI 中查看对象时会显示这些图像。 Whosebug 和 Salesforce:StackExchange 中都有关于此主题的多个条目。其中许多条目讨论 Apex 方法。那些讨论通过 REST API 检索图像的人没有让我成功。

SF REST API 开发人员指南 here 中的一个条目指导我们如何实现这一点: 通过 GET 向 REST API 发送请求,如下所示:

 /vXX.X/sobjects/SObjectName/id/richTextImageFields/fieldName/contentReferenceId 

这里的技巧是确定什么是 SObjectName、id、fieldName 和 contentReferenceId。 我们可以从正在使用的 SF 数据库模式中获取名称。幸运的是,我们可以从 RTF 字段中嵌入的 link 中获取 ID。

ID

RTF 字段中嵌入的 link 采用以下形式:

https://[someInternalSalesforceURL].force.com/servlet/rtaImage?eid=a0Y3l00000G31DT&feoid=00N1N00000F14uz&refid=0EM3l0000039EK0

这里有三个IDlink:

  • eid:实体 ID
  • feoid:字段实体 ID
  • refid:内容参考 ID

我们需要使用eid和refid构造对SF REST的请求API如下:

  • id = eid
  • contentReferenceId = contentReference ID

在上面的例子中:

/vXX.X/sobjects/SObjectName/a0Y3l00000G31DT/richTextImageFields/fieldName/0EM3l0000039EK0

名字

下一步是检查您的数据库架构并计算出 SObjectName 和 fieldName。 SObjectName 是包含 RTF 字段的自定义对象的名称。说:myObject__c fieldName 显然是 RTF 字段的名称:比如 myRTFfield__c 然后对 SF 的请求结果为:

/vXX.X/sobjects/myObject__c/a0Y3l00000G31DT/richTextImageFields/myRTFfield__c/0EM3l0000039EK0

正在检索图像

在将其发送到 SF 之前,您需要在其前面加上您的 salesforce 实例 URL,并且您需要阐明 REST API 版本,例如v48.0

将此作为 GET 发送到 SF,我是 R 用户,returns 包含图像作为数据的对象(在 R 情况下:矩阵)。此数据对象可以转换为图像并保存为 PNG 文件。

假设

  • 您已获得 SF API 的授权并收到访问令牌或 SessionID 以及 instance_url。
  • 您有向 SF 发送查询的代码,其中 returns 具有相关 RTF 字段的对象。
  • 您已从 RTF 字段中检索到嵌入的 link(s) 并从 link.
  • 中剥离了 eid 和 refid

示例 R 代码

在 R 中看起来像这样:

library(httr)
library(png)
request_headers <- c("Accept" = "application/json", 
                     "Content-Type" = "application/json",
                     "Authorization" = paste0("Bearer ", access_token))
url <- "/services/data/v48.0/sobjects/myObject__c/a0Y3l00000G31DT/richTextImageFields/myRTFfield__c/0EM3l0000039EK0"
url <- paste0(instance_url, url) 
result <- GET(url, add_headers(request_headers))
img <- content(result, type = "image/png")
writePNG(img, "myImage.png")