PHP对接Dynamic 365提交记录后如何获取返回的记录GUID
问题原因
Dynamics 365 Web API默认创建记录(POST请求)成功后会返回204 No Content状态码,响应体为空,所以你直接读取$response无法拿到内容。想要获取新创建记录的GUID,有两种常用实现方案:
方案1:从响应头提取GUID(性能最优)
创建成功后响应头会自带OData-EntityId字段,值为新记录的完整资源路径,其中包含GUID,无需额外配置返回实体内容,性能开销更低。
修改后代码示例:
$curl = curl_init(); $URL_String = $_SESSION['crm365']['rest_api_url'] . 'my individual entity'; curl_setopt_array($curl, array( CURLOPT_URL => $URL_String, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => json_encode($add_indivudual), // 开启获取响应头 CURLOPT_HEADER => true, CURLOPT_HTTPHEADER => array( 'OData-MaxVersion: 4.0', 'OData-Version: 4.0', 'Content-Type: application/json', 'Accept: application/json', // 注意确认token格式,必须拼接Authorization: Bearer前缀 'Authorization: Bearer ' . $_SESSION['crm365']['access_token'] ), )); $response = curl_exec($curl); // 拆分响应头和响应体 $header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE); $headers = substr($response, 0, $header_size); // 正则提取OData-EntityId中的GUID preg_match('/OData-EntityId: .*\((.*?)\)/i', $headers, $matches); $new_record_guid = $matches[1] ?? ''; curl_close($curl);
方案2:配置请求返回创建的实体内容
在请求头中添加Prefer: return=representation,请求成功后响应体就会返回完整的实体数据,直接解析即可拿到GUID和其他字段值,适合需要同时获取多个新生成字段的场景。
修改后代码示例:
$curl = curl_init(); $URL_String = $_SESSION['crm365']['rest_api_url'] . 'my individual entity'; curl_setopt_array($curl, array( CURLOPT_URL => $URL_String, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => json_encode($add_indivudual), CURLOPT_HTTPHEADER => array( 'OData-MaxVersion: 4.0', 'OData-Version: 4.0', 'Content-Type: application/json', 'Accept: application/json', // 新增Prefer头要求接口返回创建的实体内容 'Prefer: return=representation', // 注意补全Authorization前缀 'Authorization: Bearer ' . $_SESSION['crm365']['access_token'] ), )); $response = curl_exec($curl); $response_data = json_decode($response, true); // 实体主键字段格式通常为「实体名+id」,例如实体为my_individual,主键就是my_individualid,可根据实际情况调整 $new_record_guid = $response_data['my_individualid'] ?? ''; curl_close($curl);
内容的提问来源于stack exchange,提问作者Benny Argo
相关产品推荐
相关产品推荐

