使用Computer Vision API v1.0识别手写文本返回空响应求助
解决Azure Computer Vision API RecognizeText接口空响应问题
看起来你遇到的问题大概率是没摸透recognizeText接口的异步特性——这个接口不会直接返回识别结果,得分成两步操作:先提交图片获取任务地址,再轮询该地址拿到最终结果。另外从你给出的代码片段来看,还有几个关键细节没处理到位,我帮你梳理下:
常见问题根源
recognizeText是异步API,首次POST请求只会返回一个Operation-Location响应头,不会直接输出文本识别结果,直接读取响应体自然是空的- 代码里大概率缺失了订阅密钥头(Ocp-Apim-Subscription-Key),这是调用Azure认知服务的必备验证参数
- 没有设置图片的请求体(比如图片二进制数据或者Base64编码内容),API根本拿不到待识别的素材
修正后的完整PHP代码示例
<?php $subscriptionKey = "你的Azure订阅密钥"; $imageSource = "本地图片路径或者图片网络URL"; // 二选一即可 // 第一步:提交识别请求,获取任务轮询地址 $request = new HttpRequest(); $request->setUrl('https://westcentralus.api.cognitive.microsoft.com/vision/v1.0/recognizeText'); $request->setMethod(HTTP_METH_POST); $request->setQueryData(array( 'language' => 'en', 'handwriting' => 'true' )); $request->setHeaders(array( 'Ocp-Apim-Subscription-Key' => $subscriptionKey, 'Content-Type' => 'application/octet-stream' // 用网络URL的话改成application/json )); // 根据图片来源设置请求体 if (file_exists($imageSource)) { // 本地图片:读取二进制数据 $request->setBody(file_get_contents($imageSource)); } else { // 网络图片:传入JSON格式的URL $request->setBody(json_encode(array('url' => $imageSource))); $request->setHeaders(array('Content-Type' => 'application/json')); } try { $response = $request->send(); // 提取轮询用的Operation-Location地址 $operationLocation = $response->getHeader('Operation-Location'); if (!$operationLocation) { die("无法获取任务地址,请检查订阅密钥和请求参数是否正确"); } // 第二步:轮询任务地址获取结果,建议间隔1-2秒重试 $maxRetries = 10; $retryCount = 0; $finalResult = null; while ($retryCount < $maxRetries) { $retryCount++; sleep(1); // 等待1秒再发起重试,避免触发API限流 $resultRequest = new HttpRequest(); $resultRequest->setUrl($operationLocation); $resultRequest->setMethod(HTTP_METH_GET); $resultRequest->setHeaders(array( 'Ocp-Apim-Subscription-Key' => $subscriptionKey )); $resultResponse = $resultRequest->send(); $resultData = json_decode($resultResponse->getBody(), true); if ($resultData['status'] === 'Succeeded') { $finalResult = $resultData['recognitionResult']; break; } elseif ($resultData['status'] === 'Failed') { die("识别任务失败:" . $resultData['message']); } } if ($finalResult) { echo "识别结果:\n"; foreach ($finalResult['lines'] as $line) { echo $line['text'] . "\n"; } } else { die("超过重试次数,未能获取识别结果"); } } catch (HttpException $ex) { echo "请求出错:" . $ex->getMessage(); } ?>
关键注意事项
- 务必替换
$subscriptionKey为你自己的Azure Computer Vision订阅密钥 - 根据图片来源选择对应的
Content-Type:本地图片用application/octet-stream,网络URL用application/json - 异步接口的轮询间隔别太短,建议1-2秒一次,避免触发API限流机制
- 检查代码里的API区域(示例中是westcentralus)是否和订阅密钥的所属区域一致,区域不匹配会直接导致请求失败
内容的提问来源于stack exchange,提问作者Nick Dunas
相关产品推荐
相关产品推荐

