首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Salesforce -按一下按钮调用外部API并从响应中更新自定义字段。

Salesforce -按一下按钮调用外部API并从响应中更新自定义字段。
EN

Stack Overflow用户
提问于 2020-08-11 10:16:47
回答 2查看 6.2K关注 0票数 3

因此,我首先要说,我是一个拥有丰富经验的C# .Net/Javascript开发人员,但我对Salesforce没有任何经验。今天以前从没见过。因此,另一个团队要求我向Contact对象添加一个自定义按钮,当单击该按钮时,该对象将调用外部API并使用响应更新联系人中的自定义字段。它被强调为“只要写一些Javascript,当一个按钮被点击时调用一个API,它实际上被嵌入到页面中,15分钟的任务.”。

在看上去相当过时的文档之后,我在Object中结束了,选择了Contact对象,我进入了按钮、链接和操作页面。在此之前,我假设使用执行Javascript行为,在闪电版本中,我被建议不要使用。因此,我在谷歌上读过很多关于APEX类、Visualforce组件、闪电组件、Salesforce REST等的文章。

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

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

任何指南针都会赏识。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-11 23:32:12

哦天哪。它可以是一个15分钟的工作,但这绝对是“当你知道如何”或有一些例子;

  1. 你的用户界面是什么,经典还是闪电?他们有计划尽快迁移到闪电吗?我假设是闪电,如果你知道“执行JavaScript”的黑客是通过的。
  2. ,你关心按钮/动作会在哪里吗?右上角和所有其他按钮都很好,还是希望它在页面中的任何区域都可以下垂?
  3. 需要用户名、密码或证书吗?它将决定您是只需要在防火墙上白名单端点(安装Credentials).
  4. Do ->远程站点设置)还是需要更高级的设置(安装->您有SFDX命令行,VSCode /是否决定安装一些工具?闪电网络组件是最前沿的,最圆滑的等等,但你不能直接在浏览器中创建它们(至少还没有),你需要工具。Visualforce没有问题,但对于这个用例来说没有什么特别之处,Aura组件编写起来有点笨重--但是您可以在开发人员控制台中完成这两项任务,而不需要额外的tooling.
  5. Parsing -- JSON响应--这取决于它有多复杂,您可以用JSON.deserializeUntyped()手工解析器,但是生命周期太短了。下面是一个很好的顶级代码生成器,类似于解析WSDL:https://json2apex.herokuapp.com/

我们试着用Aura组件的方法。很难看,LWC是未来,但是嘿,它会让你开始。

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

创建新的Apex类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)。您可以勾选最后一个关于“闪电快速行动”的复选框。名称可以与类相同,但不必如此。

对于组件(~ html部件),粘贴以下内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- 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>

用于控制器(~ JavaScript)粘贴此

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
({
    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对象管理器、->联系人、->按钮、链接和操作。创建新的快速操作。并将其添加到页面布局中!

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

如果你调整它,它就死了,但是很难看到任何JavaScript错误--因为默认情况下是在发布模式下运行,SF重写了你的源代码,优化了,填充了“浏览器”,比如IE11.转到安装->调试模式并为您的用户启用。

在sandbox / dev org中,最好设置->会话设置->并取消“启用安全和持久的浏览器缓存以提高性能”。你的组件总是新鲜的,省去了一些疯狂的打击Ctrl+R。

票数 3
EN

Stack Overflow用户

发布于 2020-08-11 15:50:58

我会写信给你我的方法

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

照明组件,它将非常简单,只是有一个顶点类作为控制器的例子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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>

控制器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
({
fetchContact : function(component, event, helper) {
    helper.fetchContactHelper(component, event, helper);
    
}
})

辅助对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
({
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);
}
})

假设是顶点函数是fetchContacts和类contactController

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63364119

复制
相关文章
在Excel公式中嵌入查找表
通常,我们会在工作表中放置查找表,然后使用公式在该表中查找相对应的值。然而,这也存在风险,就是用户可能会在删除行时无意识地将查找表中的内容也删除,从而导致查找错误。
fanjy
2023/09/23
3070
在Excel公式中嵌入查找表
EXCEL公式使用
表示内容如果包含√,则为真,为红色 表示内容开头为低,则为真 表示选中全部
诺谦
2022/05/10
5440
EXCEL公式使用
在Excel公式中巧妙添加注释
当完成一个复杂的公式之后,确实很有成就感,然而当过段时间再来看这个公式时,你可能无法很快看出这个公式的运作原理,或者你当初是怎么写出这个公式的。同样,当你将这个公式发给他人时,他人也可能无法很快看出为什么要使用这样的公式,公式的内在逻辑是什么,或许他人要花费一段时间来理解公式。
fanjy
2023/09/01
7710
在Excel公式中巧妙添加注释
Excel小技巧83:在Excel公式中插入双引号
然而,有些情况下,单引号有特殊的意义,例如表示英尺和英寸时,必须同时使用单引号和双引号(例如5’6”是五英尺六英寸的简写)。此时,在双引号内就不能使用单引号了。
fanjy
2021/06/01
14.8K0
Excel小技巧83:在Excel公式中插入双引号
Excel公式技巧24: Excel公式中的降维技术
看过前面一系列文章的朋友,一定会熟悉“重新定义数组维度”的概念。这是一项非常有用且非常重要的技术,使我们可以接受二维数组并将其转换为一维数组,同时将元素保留在该数组中。
fanjy
2020/03/25
2.1K0
Excel公式技巧24: Excel公式中的降维技术
Excel公式技巧:Excel公式中的数字9.99999999E+307
这个数字:9.9999999E+307,我们经常会在公式中用得上它。这是一个神奇的数字,在查找数值时能够发挥很大的作用。本文介绍的就是这个数字的使用技巧。
fanjy
2022/11/16
1K0
Excel公式技巧18: 使用公式排序
Excel提供了排序功能,可以方便地对选中的列表进行排序。本文给出一个基于公式的排序解决方案,将指定区域内的数据按字母顺序排序。
fanjy
2020/03/12
2.1K0
Excel小技巧58: 在公式中快速应用名称
在Excel中,名称是一个非常好的功能,不仅能够简化公式,而且让公式的可读性更好。本文介绍一个小技巧,可以让定义的名称快速应用到公式中。对于使用单元格引用的公式,这是一个非常好应用名称的方法。
fanjy
2020/09/27
1.1K0
Excel小技巧58: 在公式中快速应用名称
Excel公式技巧94:在不同的工作表中查找数据
很多时候,我们都需要从工作簿中的各工作表中提取数据信息。如果你在给工作表命名时遵循一定的规则,那么可以将VLOOKUP函数与INDIRECT函数结合使用,以从不同的工作表中提取数据。这项技术可以节省时间,提高效率。
fanjy
2021/07/12
13.1K0
Excel公式技巧39: COUNTIF函数在文本排序中的应用
我们知道,COUNTIF函数通常用于查找指定单元格区域中满足条件的单元格数量。然而,COUNTIF函数有一个比较有用的用法,它可以统计指定区域中大于或小于指定值的单元格数量。例如,公式:
fanjy
2020/07/16
6.3K0
Excel公式技巧32: 处理公式中的布尔值
在我们编写公式时,特别是编写数组公式时,往往会生成由TRUE/FALSE值组成的中间数组。有些Excel函数可以忽略这些布尔值,例如SUM函数,但是很多函数不能处理这些布尔值,如果将它们传递给这些函数,就会导致错误。因此,在将这些布尔值传递给函数继续处理时,需要将它们转换成数字。
fanjy
2020/05/14
2.8K0
使用VBA操作Excel公式栏
在Excel公式栏中,我们可以看到当前单元格中的内容,或者当前单元格中使用的公式,如下图1所示。
fanjy
2022/06/04
1.5K0
使用VBA操作Excel公式栏
精通Excel数组公式023:使用数组公式的条件格式
条件格式是有趣的,特别是使用公式并链接条件到单元格中时。下面是使用公式的条件格式的一些说明:
fanjy
2021/03/12
2.9K0
Excel公式技巧27: 在条件格式中使用公式来突出显示单元格
条件格式与公式相配合,往往能够发挥很大的威力,其中之一就是用来突出显示单元格。如下图1所示,在“新建格式规则”对话框中:
fanjy
2020/04/14
3.3K0
Excel公式技巧27: 在条件格式中使用公式来突出显示单元格
【Excel】用公式提取Excel单元格中的汉字
昨天一个前端的朋友找我帮忙用excel提取代码中的汉字(字符串),可算费了劲儿了,他要提取的内容均在单引号中,但问题是没有统一的规律,同一个单元格可能存在多个要提取的内容,而且汉字中间也夹杂其他字符。
数据科学社区
2018/06/11
8.6K0
Excel公式技巧17: 使用VLOOKUP函数在多个工作表中查找相匹配的值(2)
我们给出了基于在多个工作表给定列中匹配单个条件来返回值的解决方案。本文使用与之相同的示例,但是将匹配多个条件,并提供两个解决方案:一个是使用辅助列,另一个不使用辅助列。
fanjy
2020/03/12
14.2K0
Excel公式技巧16: 使用VLOOKUP函数在多个工作表中查找相匹配的值(1)
在某个工作表单元格区域中查找值时,我们通常都会使用VLOOKUP函数。但是,如果在多个工作表中查找值并返回第一个相匹配的值时,可以使用VLOOKUP函数吗?本文将讲解这个技术。
fanjy
2020/03/12
25.8K0
Excel公式练习50: 在公式中用特定构造代替常量数组
导语:继续研究来自于excelxor.com的案例。建议结合本文阅读原文,会了解更多的细节,会有更大的收获。
fanjy
2020/03/17
5420
Excel公式:获取句子中位于最后的词的3个典型公式
好久没有碰复杂的公式了,这不,手又有点痒痒了。这里的示例来自excelunplugged.com,权当练练手,活动活动头脑。
fanjy
2022/11/16
1K0
Excel公式:获取句子中位于最后的词的3个典型公式
Excel公式技巧:使用OFFSET函数生成的数组
如何在一列列表中创建包含筛选项目的数组?SUBTOTAL函数允许使用有限数量的工作表函数对此类数组进行操作,但它不会展现进行公式操作的这个数组。然而,OFFSET函数的第二个参数是数组时,例如:
fanjy
2023/02/24
1.8K0
Excel公式技巧:使用OFFSET函数生成的数组

相似问题

从库返回IEnumerable<T>或List<T>

20

如何将通用List<T>转换为基于接口的List<T>

70

在Repository<T>中返回Queryable<T>或List<T>

44

返回List<T>而返回List<dynamic>的泛型方法

26

使用接口作为List<T>的参数

35
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文