PHP Curl请求无法触发Apex REST WebService问题求助
排查PHP Curl调用Salesforce Apex REST无响应问题
我之前也碰到过类似的情况,结合你的描述,咱们一步步来定位问题:
1. 先解决307重定向遗留问题
你提到之前出现过307临时重定向,Postman默认会自动跟进重定向,但PHP Curl默认是关闭这个功能的——这很可能是请求没触达Salesforce端点的核心原因。给Curl加上重定向跟随配置:
// 允许自动跟随重定向 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 设置最大重定向次数,防止死循环 curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
2. 开启Curl错误日志,抓请求细节
现在你看不到任何错误信息,根本不知道请求到底卡在了哪里。在curl_exec之后加上错误检查和请求详情打印,帮你定位问题:
$result = curl_exec($ch); // 检查Curl执行层面的错误 if(curl_errno($ch)) { echo 'Curl执行错误: ' . curl_error($ch); } // 打印请求的完整元数据,比如实际返回的HTTP状态码、最终请求的URL、发送的Header等 var_dump(curl_getinfo($ch)); curl_close($ch);
通过curl_getinfo返回的内容,你可以和Postman的请求详情做对比,很快就能找到差异点。
3. 对齐Postman的Header配置
Postman自动添加了Cache-Control: no-cache和Postman-Token,虽然这些不是强制要求,但有时候Salesforce的端点会对请求的Header完整性有隐性要求。另外,手动设置Content-Length可以避免Curl自动计算时出现的偏差:
curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Authorization: Bearer '.$accessToken, 'Cache-Control: no-cache', 'Content-Length: ' . strlen($jsonDataEncoded) ));
同时别忘了确认$ret_res变量是否有有效数据——如果它是空的,发送的JSON就是空内容,也可能导致Salesforce端无日志。可以先var_dump($jsonDataEncoded)看看结果。
4. 再确认Access Token的有效性(虽然Postman能用,但多一层验证)
有时候PHP代码获取的token和Postman使用的可能不是同一个环境的?可以在PHP里打印$accessToken和Postman的对比,或者调用Salesforce的身份端点验证token:
$identityUrl = 'https://login.salesforce.com/services/oauth2/userinfo'; $ch2 = curl_init($identityUrl); curl_setopt($ch2, CURLOPT_HTTPHEADER, array('Authorization: Bearer '.$accessToken)); curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); $userInfo = json_decode(curl_exec($ch2)); var_dump($userInfo);
如果能返回用户信息,说明token是有效的。
修改后的完整代码示例
$rAuth = json_decode(file_get_contents('https://dare.net/wpsf_auth.php/')); $accessToken = $rAuth->access_token; $url = 'https://dev2193--tfdev.cs47.my.salesforce.com/services/apexrest/wordpress/registration'; $ch = curl_init($url); // 先确认要发送的数据是否有效 var_dump($ret_res); $jsonDataEncoded = json_encode($ret_res); curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonDataEncoded); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Authorization: Bearer '.$accessToken, 'Cache-Control: no-cache', 'Content-Length: ' . strlen($jsonDataEncoded) )); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); // 开启重定向跟随 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_MAXREDIRS, 5); $result = curl_exec($ch); // 错误排查环节 if(curl_errno($ch)) { echo 'Curl执行错误: ' . curl_error($ch); } var_dump(curl_getinfo($ch)); curl_close($ch); $resultData = json_decode($result); var_dump($resultData);
先按这个步骤排查,重点看curl_getinfo返回的HTTP状态码和最终请求URL,应该能快速找到问题所在。
内容的提问来源于stack exchange,提问作者pintu
相关产品推荐
相关产品推荐

