[英]How to push Salesforce Order to an external REST API?
我在 Salesforce 管理方面有经验,但在 Salesforce 开发方面没有经验。
我的任务是将 Salesforce 中的订单推送到外部 REST API,如果订单处于自定义状态“处理中”且订单开始日期(生效日期)为 1 天。
订单将在下游系统中处理。
如果订单成功推送到 REST API 状态应更改为“已激活”。
任何人都可以给我一些示例代码来开始吗?
There's very cool guide for picking right mechanism, I've been studying from this PDF for one of SF certifications: https://developer.salesforce.com/docs/atlas.en-us.integration_patterns_and_practices.meta/integration_patterns_and_practices/integ_pat_intro_overview.htm
很大程度上取决于端点是否可以从 Salesforce 访问(如果不是 - 您可能必须提取数据而不是推送),它需要什么身份验证。
对于推出Salesforce 你可以使用
出站消息- 它是一个 XML 文档,当(在您的情况下是基于时间的?)工作流触发时发送,而不是 REST 但它只是点击,没有代码。 缺点是消息中只有 1 个 object。 因此,您可以发送订单 header 但没有订单项。
外部服务将是无代码的,您可以使用它构建流程。
您可以随时使用 Apex 代码推送数据(类似这样)。 我们将解决方案分成 2 位。
完成实际工作的部分:在高层次上,您将编写 function ,它将订单 ID 列表作为参数,查询它们,调用req.setBody(JSON.serialize([SELECT Id, OrderNumber FROM Order WHERE Id IN:ids]));
...如果 API 需要一些特殊的身份验证 - 你会查看“命名凭据”。 如果不了解更多关于您的目标,很难说出您需要什么。
以及到时候将其称为 Apex 的部分。 可能是更多代码(每晚安排的工作,在午夜后 1 分钟发出这些标注?)
可能是调用此 Apex 的流程/流程构建器(同样,您可能需要基于时间的流程)。 “worker”代码必须“实现接口”(一种奇特的说法,即代码承诺将有 function “suchAndSuchName”,它采用“suchAndSuch”参数)。 检查Process.Plugin 。
为了拉取数据......好吧,目标应用程序可以登录到SF(SOAP,REST)并每天查询一次订单表。 很多集成工具都有 Salesforce 插件,您是否已经在使用 Azure 数据工厂? 信息学? 商谈? 骡软?
还有一种叫做“长轮询”的东西,客户端应用程序订阅通知,SF 将信息推送给它们。 您可能听说过 CometD? 在 SF-speak 中阅读有关平台事件、流式传输 API、更改数据捕获(尽管最后一个在更改时触发并仅发送更改的字段,不适用于推送完整的订单 + 行项目)。 您也可以从流中发送平台事件。
所以......不要直接对解决方案进行编码。 计划一下,维护会更容易。 这是未经测试的,用记事本写的,我没有手边的订单...但理论上你应该能够安排它在凌晨 1 点运行。 或者从开发控制台,您可以使用Database.executeBatch(new OrderSyncBatch(), 1);
触发它。
public class OrderSyncBatch implements Database.Batchable, Database.AllowsCallouts {
public Database.QueryLocator start(Database.BatchableContext bc) {
Date cutoff = System.today().addDays(10);
return Database.getQueryLocator([SELECT Id, Name, Account.Name, GrandTotalAmount, OrderNumber, OrderReferenceNumber,
(SELECT Id, UnitPrice, Quantity, OrderId FROM OrderItems)
FROM Order
WHERE Status = 'Processing' AND EffectiveDate = :cutoff]);
}
public void execute(Database.BatchableContext bc, List<sObject> scope) {
Http h = new Http();
List<Order> toUpdate = new List<Order>();
// Assuming you want 1 order at a time, not a list of orders?
for (Order o : (List<Order>)scope) {
HttpRequest req = new HttpRequest();
HttpResponse res;
req.setEndpoint('https://example.com'); // your API endpoint here, or maybe something that starts with "callout:" if you'd be using Named Credentials
req.setMethod('POST');
req.setHeader('Content-Type', 'application/json');
req.setBody(JSON.serializePretty(o));
res = h.send(req);
if (res.getStatusCode() == 200) {
o.Status = 'Activated';
toUpdate.add(o);
}
else {
// Error handling? Maybe just debug it, maybe make a Task for the user or look into
// Database.RaisesPlatformEvents
System.debug(res);
}
}
update toUpdate;
}
public void finish(Database.BatchableContext bc) {}
public void execute(SchedulableContext sc){
Database.executeBatch(new OrderSyncBatch(), Limits.getLimitCallouts()); // there's limit of 10 callouts per single transaction
// and by default batches process 200 records at a time so we want smaller chunks
// https://developer.salesforce.com/docs/atlas.en-us.apexref.meta/apexref/apex_methods_system_limits.htm
// You might want to tweak the parameter even down to 1 order at a time if processing takes a while at the other end.
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.