Apex如何将HTTP响应key值回填至Salesforce Case对象
核心实现逻辑
- 原代码存在的核心问题是直接把整段HTTP响应体赋值给key变量,没有做JSON字段提取,也没有执行对Salesforce Case的更新操作,需要按三步补全逻辑:
- 接口调用完成后先校验响应状态码,确认请求成功再开展后续解析逻辑,避免接口报错时触发运行时异常
- 对JSON格式的响应体做解析,精准提取其中
key字段的实际值 - 通过入参携带的CaseNumber定位到对应的Case记录,将提取到的key值赋值给Case上对应的业务存储字段,执行DML更新完成回填
- 额外的健壮性优化:对请求接口时传入的参数做URL编码,避免参数内容里的特殊字符导致请求参数解析错乱
修正后的可运行代码
public static void createCase(String id, String Description, String Subject, String CaseNumber) { Http http = new Http(); HttpRequest request = new HttpRequest(); // 对描述参数做URL编码,避免特殊字符截断请求参数 request.setEndpoint('https://TrainingAPAC.jitterbit.cc/v1.1/caseSyncInsert?id=' + id + '&Jid=' + Subject + '&desc=' + EncodingUtil.urlEncode(Description, 'UTF-8') + '&caseNumber=' + CaseNumber); request.setMethod('POST'); request.setHeader('Content-Type', 'application/json;charset=UTF-8'); HttpResponse response = http.send(request); System.debug('接口返回状态码:' + response.getStatusCode()); System.debug('接口返回全量响应体:' + response.getBody()); // 仅在接口返回2xx成功状态时做后续处理 if (response.getStatusCode() >= 200 && response.getStatusCode() < 300) { // 解析JSON响应,提取目标key值,替代原代码直接取全量响应体的错误写法 Map<String, Object> responseBodyMap = (Map<String, Object>) JSON.deserializeUntyped(response.getBody()); String extractedKey = String.valueOf(responseBodyMap.get('key')); System.debug('提取到的目标key值:' + extractedKey); // 定位对应需要更新的Case记录 // 注意:Jira_Issue_Key__c 为示例占位字段,需替换为你组织Case对象上实际存储该key值的字段API名 List<Case> caseToUpdate = [ SELECT Id, CaseNumber FROM Case WHERE CaseNumber = :CaseNumber LIMIT 1 ]; // 完成赋值并执行更新 if (!caseToUpdate.isEmpty() && String.isNotBlank(extractedKey)) { caseToUpdate[0].Jira_Issue_Key__c = extractedKey; update caseToUpdate; } } else { System.error('第三方接口调用失败,状态码:' + response.getStatusCode() + ',错误信息:' + response.getBody()); } }
实现注意事项
- 代码中
Jira_Issue_Key__c为示例占位字段,需要替换为你自己组织在Case对象上实际用于存储该key值的自定义字段API名称 - 如果后续接口返回的JSON结构变得复杂,可以定义匹配响应结构的Apex实体类做反序列化,比非类型化的Map解析有更高的类型安全保障
- 查询Case时建议保留
LIMIT 1的限制,避免CaseNumber重复时批量更新多条无关记录
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

