keyerror: 'result'源于未校验百度api响应结构,需先检查json_decode是否成功、err_no是否为0、result字段是否存在且为数组,再安全提取。

百度API在Symfony 2里报错,不是框架不兼容,而是请求层和响应解析层没对齐——Symfony 2本身不干预HTTP调用,但默认没做容错包装,KeyError: 'result'这类错误几乎全是客户端代码没处理API的异常响应结构导致的。
为什么Symfony 2里调用百度API容易触发KeyError: 'result'
因为Symfony 2没有内置的JSON API客户端抽象,开发者通常直接用file_get_contents或cURL发请求,再用json_decode硬解,却忽略了百度API返回的错误响应根本不含result字段。
- 百度API成功时返回
{"err_no":0,"result":["xxx"]},失败时是{"err_no":500,"err_msg":"invalid token"}——result只在err_no === 0时存在 - Symfony 2的
HttpKernel不拦截第三方HTTP请求,不会帮你补try/catch或校验response->getStatusCode() - 很多老项目还在用
sfYaml或自定义HttpClient类,没统一处理Content-Type: application/json和err_no语义
如何安全解析百度API响应(Symfony 2兼容写法)
别直接$data['result'],先确认状态再取值。以下是在Controller或Service里可直接复用的判断逻辑:
百度热榜监控 | Baidu Hot Topics Monitor. 获取百度热搜榜、搜索趋势、关键词热度 | Get Baidu trending searches, trends, keyword popularity. 触发词:百度、热搜、baidu.
- 用
json_last_error()检查解码是否失败,避免null返回后继续访问['result'] - 必须检查
$data['err_no'] === 0,而不是只看HTTP状态码——百度API常返回200但err_no非零 - 提取
result前加isset($data['result']) && is_array($data['result'])双重防护 - 示例片段:
if (200 === $httpCode && JSON_ERROR_NONE === json_last_error()) { $data = json_decode($response, true); if (isset($data['err_no']) && 0 === $data['err_no'] && isset($data['result'])) { return $data['result']; } }
常见踩坑点:token、format、rate三参数必须严格匹配
Symfony 2项目往往把百度API配置写死在app/config/parameters.yml里,但format、rate、dev_pid这些参数一旦和音频实际属性不符,服务端就静默返回空result或err_no=3301(音频格式错误),而非抛异常。
-
format要和文件扩展名+编码一致:WAV文件不能设format=amr,PCM裸数据必须声明format=pcm且带rate和channel -
rate必须等于音频真实采样率(如16000),用ffprobe验证:ffprobe -v quiet -show_entries stream=sample_rate -of default=nw=1 input.wav -
dev_pid不能漏:中文普通话用1537,英文用1737,填错会导致err_no=2000但无提示 - token过期不报
KeyError,但会返回err_no=110或err_no=111,需单独捕获处理
要不要升级到Symfony 4+?先看这三点
不是必须升,但如果你正被这些问题反复拖慢迭代,升级能省掉大量胶水代码:
- Symfony 4+的
HttpClient组件原生支持on-error回调和toArray()自动判空,不用手写isset链 - 新版Serializer可定义
ApiErrorResponse类,把err_no/err_msg映射成PHP异常,统一走kernel.exception事件 - EasyAdmin或API Platform集成百度API时,能直接用
@ParamConverter预处理响应,避免控制器里堆条件判断
老项目维持Symfony 2也行,关键是把百度API调用封装成独立Service,并强制所有调用点走这个入口——否则每处都补isset和err_no检查,迟早漏掉一处。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










