Salesforce平台RemedyForce服务请求POST调用出现类型转换报错
接口类型转换异常修复方案
核心报错触发原因
- 最核心的致命逻辑错误:初始化
$params时,直接把带PHP数组语法的纯文本字符串作为单元素传入数组,执行json_encode后生成的请求体是顶层被[]包裹的数组,数组内容是一段无意义的PHP语法字符串,与BMC Apex接口期望的顶层JSON对象(对应Apex侧Map<String, Object>类型)完全不匹配,直接触发类型转换报错。 - curl执行逻辑存在冗余错误:在
curl_close($ch)销毁句柄后,又重复调用curl_exec($ch),此时获取的响应为空,完全无法拿到接口真实返回,干扰问题定位。
接口要求的标准请求体结构
BMC RemedyForce创建服务请求的REST接口,要求顶层JSON为对象格式,包含两个一级字段:
Fields:数组类型,每个元素为包含Name、Value键的对象,存储服务请求基础属性值Answers:数组类型,每个元素为包含QuestionId、Values键的对象,存储表单答题项内容
修正后的可运行代码
<?php $url = 'https://YOUR_INSTANCE.my.salesforce.com/services/apexrest/BMCServiceDesk/1.0/ServiceRequest/'; $ch = curl_init($url); $sf_auth = 'Bearer YOUR_VALID_OAUTH_TOKEN'; // 直接构建与JSON结构对应的多维数组,禁止传入带PHP语法的字符串 $params = [ 'Fields' => [ [ 'Name' => 'requestDefinitionId', 'Value' => 'a3Hf0000000lTNaEAM', ], [ 'Name' => 'client', 'Value' => '0053j00000A7rWLAAZ', ], ], 'Answers' => [ [ 'QuestionId' => 'a3Df0000000qI63EAE', 'Values' => ['Reclamação'], ], [ 'QuestionId' => 'a3Df0000000qHvsEAE', 'Values' => ['Solicitação de Serviço aberta por qualquer integração web'], ], [ 'QuestionId' => 'a3Df0000000qHwREAU', 'Values' => ['Web'], ], ], ]; // 编码时保留非英文字符,避免乱码 $data_string = json_encode($params, JSON_UNESCAPED_UNICODE); curl_setopt_array($ch, [ CURLOPT_HTTPHEADER => [ 'Accept: application/json', 'Content-type: application/json', 'Authorization: ' . $sf_auth, ], CURLOPT_URL => $url, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => $data_string, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 5, CURLOPT_CONNECTTIMEOUT => 5, ]); $result = curl_exec($ch); $errNo = curl_errno($ch); $errMsg = curl_error($ch); // 句柄销毁需放在所有curl操作完成后 curl_close($ch); echo "Curl错误码:{$errNo}<br/>"; echo "Curl错误信息:{$errMsg}<br/>"; var_dump($result); ?>
后续排查验证要点
- 编码完成后先打印
$data_string确认:顶层结构为{}包裹的对象,而非[]包裹的数组,保证与Apex端期望的Map类型匹配 - 检查子元素结构:
Fields数组下的每个条目必须是带Name、Value键的对象,Answers数组下的每个条目必须是带QuestionId、Values键的对象,避免结构错位
内容的提问来源于stack exchange,提问作者Barcat
相关产品推荐
相关产品推荐

