簡體   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