AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 77482341
Accepted
bnthsrikanth
bnthsrikanth
Asked: 2023-11-15 00:36:47 +0800 CST2023-11-15 00:36:47 +0800 CST 2023-11-15 00:36:47 +0800 CST

我的代码性能还有提升空间吗?

  • 772

我有一个 Salesforce Apex REST 服务 (LeadService),它以 JSON 格式处理传入的潜在客户。此外,我正在寻找增强错误处理并使代码更易于维护的方法。提供建议或改进,以优化批量更新插入流程并增强整体代码结构

@RestResource(urlMapping='/api/lead')
global class Service {
@HttpPost
global static string createdata(){
   
    RestResponse res = Restcontext.response;
    String requestBody = RestContext.request.requestBody.toString();
    try {   
        // Deserialize JSON data into a list of LeadDataDeserializer objects
        List<LeadDataDeserializer> externalLeads = (List<LeadDataDeserializer>)
            JSON.deserializeStrict(requestBody, List<LeadDataDeserializer>.class);            
        // Transform LeadDataDeserializer objects into Lead data
        List<Lead> students = new List<Lead>();
        for(LeadDataDeserializer info : externalLeads) {
            Lead t_leads = setLeadFields(info);
            t_leads.company='Test Company';
            students.add(t_leads);
        }
        if(students.isEmpty()){
            res.statusCode=400;
            return 'Empty list';
            
           
        }
        else{
            List<Response> responseretn=new List<Response>();
            Database.UpsertResult[] srList = Database.upsert(students, Lead.External_Id__c, false);
            // Process upsert results if needed
            Integer i=0;
            for(Database.UpsertResult upResult:srList){
                if(upResult.isSuccess()){
                    responseretn.add(new Response(upResult.getId(),true,students[i].MobilePhone));
                }
                else{
                    System.debug(upResult.getErrors());
                    responseretn.add(new Response(upResult.getId(),false,students[i].MobilePhone));
                }
                i+=1;
            }
        
            String jsonReqBody=JSON.serialize(responseretn);
            res.statusCode = 201;
            return jsonReqBody;
            
           
                            
        }
        
    } catch(Exception e) {
        // Handle exceptions
        res.Statuscode = 500;
        return 'Internal Server Error';

        
    }
}
//Response wrapper to return
public class Response{
    public string leadId{get;set;}
    public boolean isSuccess{get;set;}
    public string mobilePhone{get;set;}
    
    public Response(String leadId,Boolean isSuccess,String mobilePhone){
        this.leadId=leadId;
        this.isSuccess=isSuccess;
        this.mobilePhone=mobilePhone;
    }
}

public static Lead setLeadFields(LeadDataDeserializer info){
    Lead extLead=new Lead();
    extLead.LastName=info.Name;
    extLead.CountryCode__c=info.countryCode; 
    extLead.MobilePhone=info.phoneNumber;
    extLead.mx_WhatsApp_Number__c=extLead.MobilePhone;
    extLead.mx_IP_Address__c=info.ipAddress;
    extLead.External_Id__c=extLead.MobilePhone;
    if(info.leadStage!=null){
        extLead.Status=info.leadStage;
    }
    if(info.campaignName!=null){
        extLead.mx_Campaign_Name__c=info.campaignName;
    }
    if(info.campaignSource!=null){
        extLead.SourceCampaign__c=info.campaignSource;
    }

    //20 more if conditions with null check like above (serializeddata.field!=null)
   
    return extLead;
}}

我使用多个 if 语句来仅处理包含具有值的字段,并且如果来自集成的值为空,则不会覆盖先前的记录值

如何有效地处理这个问题?

salesforce
  • 1 1 个回答
  • 13 Views

1 个回答

  • Voted
  1. Best Answer
    eyescream
    2023-11-15T08:30:47+08:002023-11-15T08:30:47+08:00
    if(students.isEmpty()){
       res.statusCode=400;
       return 'Empty list';
    }
    

    这有点晚了。性能不会有太大变化,但从逻辑上讲,最好尽早检查反序列化列表然后返回,而不是在从中找出线索之后返回。

    我认为您不必返回字符串。您可以轻松退货List<Response>,顺丰将为您连载。

    你想如何处理问题?能省点就省点吧?您可以针对任何问题插入 helper sObject 并运行报告。或者使用“立即发布”的平台事件,以便某些监控系统甚至特殊的顶点触发器可以处理它们。

    我可能会包含错误计数器,因此如果失败率为 100%,则返回 201 以外的其他内容

    如果它发送 > 10K 行(或者副作用将导致 > 10K dml)怎么办...如果这是一个合法的问题,我可能会重写它来启动批处理作业(批处理可以占用范围并迭代)它,他们并不总是必须以查询开始)。你可以加分,implements Database.RaisesPlatformEvents工作几乎完成,SF 将为你做很多错误处理,而不需要手动“savepoint-try-catch-rollback-insert 任务或其他任务”

    至于实际的映射代码......它不是很好,但也不是很糟糕。您可能对 null 检查有点过于天真 - 对于某些变量String.isNotBlank会更好,具体取决于源生成的 JSON。

    我会将源-目标字段映射保留在其他地方(自定义设置?自定义元数据?),这样您就不必在每次添加新字段时重新编译、部署等。

    如果您真的很喜欢,可以阅读有关 JSON.serialize 的内容,其中包含跳过空值的参数(例如,您可以反序列化输入,将其序列化回来并跳过空值,第二次反序列化,干净)。或者盲目地根据输入设置所有字段,然后 sObject.getPopulatedFieldsAsMap 并迭代它们检查什么是空的......但对于需要的东西来说感觉有点太聪明了。有时简单是最有效的。


    它是否必须是自定义 REST API?如果您可以控制源格式,您可以考虑composite使用标准 api,这样可以减少工作量。看看我的https://salesforce.stackexchange.com/a/274696/799(包括“allOrNone”标头)。正常的 upsert 不能很好地处理多个记录,这是事实 - 但这已经足够接近了!

    嗯……代码并不总是答案。如果您绝对确定标准 API 不会解决问题 - 您知道可以通过 REST api 调用流程吗?

    • 0

相关问题

  • Visualforce 页面在 Salesforce 中抛出“无法访问页面”错误

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve