繁体   English   中英

如何将 Salesforce 订单推送到外部 REST API?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM