直接用 $response->toarray() 解析百度 api 响应易失败,因其错误时返回 html/文本而非 json,成功时也可能返回纯字符串或非标准嵌套结构,需先校验 content-type 和 status,再安全取值。

直接用 $response->toArray() 就能解析,但百度 API 返回的嵌套结构常带非标准字段、空数组、混合类型,硬解容易报错或漏数据。
为什么 $response->toArray() 有时会失败
百度系 API(如地图、翻译、OCR)在错误时经常返回 HTML 页面或纯文本(比如 401 时返回登录跳转页),而不是 JSON。此时 $response->toArray() 会抛 JsonException,而不是返回空数组。
- 先检查
$response->getHeaders()['content-type'][0]是否含application/json - 若不匹配,别调
toArray()—— 直接用$response->getContent()看原始内容,确认是不是被重定向或返回了错误页 - 部分接口(如百度短网址)成功时返回纯字符串(如
"http://dwz.cn/abc123"),不是 JSON 对象,json_decode(..., true)会返回null
处理百度地图API典型嵌套结构:带 results 数组和 geocodes 的响应
例如地址解析(Geocoding)返回:
{
"status": 0,
"message": "ok",
"result": {
"location": { "lat": 39.915, "lng": 116.404 },
"formatted_address": "北京市海淀区",
"addressComponent": { "city": "北京市", "district": "海淀区" }
}
}
这种结构不能直接 ['result']['location']['lat'] 访问,因为任意层级都可能缺失或为 null。
- 用 nullsafe 操作符(PHP 8.0+):
$data?['result']?['location']?['lat'] ?? null - PHP 7.x 用
isset()嵌套判断,或封装一个安全取值函数:Arr::get($data, 'result.location.lat', null)(需引入 Symfony/Component/PropertyAccess 或自定义工具函数) - 特别注意
status !== 0时,result字段根本不存在,直接访问会触发 notice
百度翻译API返回数组但键名不一致?用 array_values() 强制转索引数组
百度翻译 V3 接口返回的 trans_result 是关联数组,键名为原文(如 ["hello"] = ["dst": "你好"]),不是标准索引数组。这会导致 foreach ($data['trans_result'] as $item) 拿到的 $item 是字符串而非数组。
- 正确做法:
$items = array_values($data['trans_result'] ?? []),再遍历 - 更稳妥:先判断
is_array($data['trans_result'] ?? null),再决定是否array_values - 不要依赖键名做循环,百度文档明确说明“key 为原文,不可用于程序逻辑”
百度 API 的坑不在 JSON 格式本身,而在字段语义不稳定——同一个接口不同版本、不同 query 参数下,result 可能变 data,status 可能是字符串 "0" 或整数 0。最保险的方式是:永远先校验结构,再取值;永远不假设字段一定存在。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











