PHP cURL调用SNOMED API无响应,浏览器访问正常求排查
解决PHP cURL调用SNOMED API返回空响应的问题
问题分析
从返回的cURL信息能看到,HTTP状态码是423 Locked,这说明服务器拒绝了请求,原因是资源被锁定。浏览器能正常访问是因为它会自动携带必要的请求头(比如User-Agent),而PHP cURL默认请求头过于简单,被服务器识别为非浏览器请求,从而被拦截。
解决方案
1. 添加浏览器模拟请求头
在cURL配置中加入User-Agent和Accept头,模拟浏览器的请求格式:
curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Accept: application/json, text/javascript, */*; q=0.01' ));
2. 开启cURL错误输出
取消代码中错误输出语句的注释,方便排查后续问题:
echo curl_error($ch); echo '<p>'; echo curl_errno($ch); echo '<p>';
3. 完整修改后的代码
<?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://browser.ihtsdotools.org/snowstorm/snomed-ct/browser/MAIN/2022-03-31/concepts/84114007"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_HEADER, false); // 添加模拟浏览器的请求头 curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Accept: application/json, text/javascript, */*; q=0.01' )); $response = curl_exec($ch); // 输出错误信息排查问题 echo curl_error($ch); echo '<p>'; echo curl_errno($ch); echo '<p>'; $info = rawurldecode(var_export(curl_getinfo($ch),true)); curl_close($ch); echo "<pre> $info<br> </pre>"; var_dump ($response); ?>
补充说明
423状态码一般是服务器反爬机制导致的,通过模拟浏览器请求头可绕过这类检测。如果添加上述头后仍有问题,可以复制浏览器请求中的全部请求头(在浏览器开发者工具的Network面板查看),全部加入到cURL的CURLOPT_HTTPHEADER中。
内容的提问来源于stack exchange,提问作者Guillaume Speierer
相关产品推荐
相关产品推荐

