繁体   English   中英

Salesforce - 在按钮单击时调用外部 API 并从响应中更新自定义字段

[英]Salesforce - Call external API on button click and update custom field from response

所以我首先要说我是 C#.Net/Javascript 开发人员,经验丰富,但我对 Salesforce 的经验为零。 在今天之前从未见过它。 因此,另一个团队要求我向联系人 object 添加一个自定义按钮,单击该按钮会调用外部 API 并使用响应更新联系人中的自定义字段。 它被宣传为“只需编写一些 Javascript,当单击按钮时调用 API,它实际上嵌入到页面中,15 分钟的工作......”。

在看起来相当过时的文档之后,我最终进入了 Object 管理器,选择了联系人 object,然后我进入了按钮、链接和操作页面。 我假设在此之前使用 Execute Javascript 行为完成,在 Lightning 版本中我建议不要使用。 因此,经过多次谷歌搜索,我已经阅读了有关 APEX 类、Visualforce 组件、Lightning 组件、Salesforce REST API 等的信息。不是 15 分钟的工作。

本质上,要求是在此联系人页面中嵌入一个按钮(或操作,或者..?),以便当销售人员单击它时,它会收集一些联系人的详细信息并使用它们来形成对外部服务的 API 调用. 数据将用于形成响应,然后必须读取该响应(如 JSON,然后解析)并写入联系人上的自定义字段。

开发解决方案的最佳方法是什么? 在 Apex 调试环境中,我将调用 API 并解析 JSON 响应的代码放在一起,我假设我需要将其包装在 Apex ZA2F2ED4F8EBC2CBB4C21A29DC40AB6 方法中调用此代码并返回响应。 我不确定如何从按钮调用它,并更新联系人中的字段。 我是否需要通过 Apex Class 方法完成所有这些工作? 传递对联系人的引用,或者是否有另一个组件需要介于两者之间并执行此操作。 我是否正确假设我需要使用 Salesforce API 来更新联系人?

任何指针表示赞赏。

我会写信给你我的方法

记录页面/页面布局上的按钮 -> 照明组件或流程 -> Apex class 用于收集数据 -> apex class 请求和响应 API(不要忘记将端点添加到远程站点设置)-> 解析响应并更新联系人(您可以在 Apex 中使用查询和 DML 操作)

照明组件将非常简单,只需将顶点 class 作为 controller 示例

<aura:component implements="force:appHostable,lightning:isUrlAddressable,flexipage:availableForAllPageTypes,flexipage:availableForRecordHome,force:hasRecordId,forceCommunity:availableForAllPageTypes,force:lightningQuickAction" controller="contactController" access="global" >

<aura:handler name="init" value="{!this}" action="{!c.fetchContact}"/>
</aura:component>

controller

({
fetchContact : function(component, event, helper) {
    helper.fetchContactHelper(component, event, helper);
    
}
})

帮手

({
fetchAccHelper : function(component, event, helper) {
    var action = component.get("c.fetchContacts");
    action.setParams({
    });
    action.setCallback(this, function(response){
        var state = response.getState();
        if (state === "SUCCESS") {
        }
    });
    $A.enqueueAction(action);
}
})

假设是顶点 function 是 fetchContacts 和 class contactController

天啊。 这可能是一个 15 分钟的工作,但绝对是“当你知道如何做的时候很容易”或者有一些例子;)

  1. 您的用户界面是什么,Classic 还是 Lightning? 他们有计划很快迁移到闪电网络吗? 如果您发现“执行 JavaScript”黑客已经过时,我假设它是 Lightning。
  2. 你关心按钮/动作在哪里吗? 所有其他按钮的右上角是否正常,或者您是否希望它可以拖放到页面中的几乎任何区域?
  3. API 标注是否需要用户名、密码或证书? 它将确定您是否需要仅将防火墙上的端点列入白名单(设置 -> 远程站点设置),或者您需要更高级的内容(设置 -> 命名凭据)。
  4. 你有 SFDX 命令行 (CLI)、VSCode/ 确定要安装一些工具吗? Lightning Web 组件是最先进的、最时尚的等,但你不能直接在浏览器中创建它们(至少现在还不能),你需要工具。 Visualforce 还可以,但对于这个用例来说没有什么特别之处,Aura 组件编写起来有点笨拙——但你可以在开发者控制台中完成这两项工作,而无需额外的工具。
  5. 解析 JSON 响应 - 取决于它的复杂程度,您可以使用JSON.deserializeUntyped()手工制作解析器,但寿命太短了。 这是一个很好的 apex 代码生成器,类似于您从解析 WSDL 获得的内容: https://json2apex.herokuapp.com/

我们将尝试做 Aura 组件的方式。 这很难看,LWC 是未来,但嘿,它会让你开始。


Go 到设置 -> 远程站点设置并使用https://en.wikipedia.org/添加新条目

创建新的 Apex class:

public with sharing class Stack63364119 {
    static final String endpoint = 'https://en.wikipedia.org/w/api.php?action=query&format=json&list=search&srsearch=';
    @AuraEnabled
    public static String doCallout(Id contactId){
        if(contactId == null){
            throw new MyException('Missing record id');
        }
        List<Contact> contacts = [SELECT MailingCountry FROM Contact WHERE Id = :contactId];
        if(contacts.isEmpty() || String.isBlank(contacts[0].MailingCountry)){
            throw new MyException('Could not find the contact');
        }
        Contact c = contacts[0];

        HttpRequest req = new HttpRequest();
        req.setEndpoint(endpoint + c.MailingCountry);
        req.setMethod('GET');

        HTTPResponse res = new Http().send(req);
        System.debug(res.getStatus());
        System.debug(res.getBody());
        // no special parsing, just chuck it into Description field
        // no error handling
        if(res.getStatusCode() == 200){
            c.Description = res.getBody().abbreviate(32000);
            update c;
        }
        return res.getBody();
    }
    public class MyException extends Exception{}
}

在开发者控制台中制作新的“闪电组件”(它将是 Aura,而不是 LWC)。 您可以勾选关于“闪电般快速行动”的最后一个复选框。 名称可以与 class 相同,但不必如此。

对于组件(~ html 部分)粘贴此

<!-- Loosely based on https://developer.salesforce.com/docs/atlas.en-us.lightning.meta/lightning/controllers_server_actions_call.htm -->
<aura:component controller="Stack63364119" implements="force:hasRecordId,force:lightningQuickAction" >
    <!-- in the name of all that is holy do not name the JS function same as the Apex class function, it'll give you very cryptic errors to debug -->
    <aura:handler name="init" value="{!this}" action="{!c.runCallout}"/> 
</aura:component>

对于 controller (~ JavaScript) 粘贴这个

({
    runCallout : function(cmp) {
        let action = cmp.get('c.doCallout');
        action.setParams({contactId : cmp.get('v.recordId')});
        action.setCallback(this, function(response){
            let state = response.getState();
            if (state === "SUCCESS") {
                alert('Saved OK: ' + response.getReturnValue());
                $A.get("e.force:closeQuickAction").fire(); // if you want to self-close
            } else if (state === "ERROR") {
                var errors = response.getError();
                if (errors) {
                    if (errors[0] && errors[0].message) {
                        console.log("Error message: " + errors[0].message);
                    }
                } else {
                    console.log("Unknown error");
                }
            }
        });
        $A.enqueueAction(action);
    }
})

最后 go Object Manager -> Contact -> Buttons Links and Actions。 创建新的快速操作。 并将其添加到页面布局!

新的快速行动 示例运行

它应该让你开始。 也许您会决定将其拆分一下,Apex 只会进行标注,将结果返回给 UI,如果用户满意 - 可以使用以下方法之一更新联系人: https://developer.salesforce.com/docs /atlas.en-us.lightning.meta/lightning/data_service_save_record.htm 关注点分离等等(但用户是否会对 2 次点击感到满意)。

PS如果你调整它并且它死了但是很难看到任何 JavaScript 错误 - 这将是因为默认是在发布模式下运行,SF 稍微重写你的源代码,优化,为像 IE11 这样的“浏览器”添加填充... Go 设置 -> 调试模式并为您的用户启用。

PPS 在沙盒/开发组织中,最好使用 go 设置 -> Session 设置 -> 并取消选中“启用安全和持久的浏览器缓存以提高性能”。 您的组件将永远是新鲜的,节省了一些疯狂的按 Ctrl+R。 不要在产品中这样做;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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