PHP调用Microsoft OCR API返回空响应,求排查与解决方案
问题分析与修复方案
你代码里的几个关键错误:
- URL格式错误:构造函数里的API地址末尾多了
HTTP/1.1,这是HTTP请求协议标识,不需要写在URL里,会导致curl请求地址无效,直接返回空响应。 - 方法调用参数不匹配:
recognize方法定义只接受1个参数,但index.php里传了2个($image_url和"ocr"),虽然暂时不会直接导致空响应,但会引发PHP警告。 - 数组直接打印问题:
json_decode返回的是数组结构,直接用print输出只会显示Array,看不到实际解析后的内容。 - SSL验证关闭风险:
CURLOPT_SSL_VERIFYPEER设为false会跳过SSL证书验证,生产环境不建议这么做,可能带来安全风险。
修正后的代码:
首先是Computer_Vision类的修正:
<?php class Computer_Vision{ public function __construct(){ // 去掉末尾多余的HTTP/1.1 $this->azure_ocr="https://brazilsouth.api.cognitive.microsoft.com/computervision/imageanalysis:analyze?api-version=2023-04-01-preview&features=read&language=pt"; $this->subscription_key="blahblahblah"; // 替换为你的实际API密钥 } public function recognize($image_url){ $data = array("url" => $image_url); $azure_url = $this->azure_ocr; print($azure_url . "<br/>"); $key=$this->subscription_key; $data_string = json_encode($data); print($data_string . "<br/>"); $curl = curl_init($azure_url); // 生产环境建议开启SSL验证,可注释或删除下面这行 // curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_POSTFIELDS, $data_string); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt($curl, CURLOPT_POST, 1 ); curl_setopt($curl, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Ocp-Apim-Subscription-Key:'.$key )); $response = curl_exec($curl); print("response: " . $response . "<br/>"); if(curl_error($curl)) { print('error:' . curl_error($curl)); } else { $json_object = json_decode($response, true); // 用print_r查看数组结构内容 print("json_object: "); print_r($json_object); } curl_close($curl); // 返回解析后的结果,方便调用方使用 return $json_object; } } ?>
然后是index.php的修正:
<?php $azure = new Computer_Vision(); $image_url = "https://portal.vision.cognitive.azure.com/dist/assets/OCR1-6dda571d.jpg"; // 仅传递一个参数,与方法定义匹配 $ocr = $azure->recognize($image_url); ?>
最优实现建议:
- 增强错误处理:除了curl错误,新增HTTP响应码检查(用
curl_getinfo($curl, CURLINFO_HTTP_CODE)),比如401代表密钥无效,400代表请求格式错误,能更精准定位问题。 - 抽离配置信息:把API密钥、端点URL放到独立的配置文件或环境变量中,不要硬编码在类里,方便后续维护和多环境切换。
- 完善请求判断:
curl_exec失败时会返回false,可先判断$response === false再处理错误,比仅依赖curl_error更全面。 - 保持SSL验证开启:生产环境务必开启SSL验证,若遇到证书问题,可通过
CURLOPT_CAINFO指定CA证书路径解决。
内容的提问来源于stack exchange,提问作者dhn
相关产品推荐
相关产品推荐

