symfony 2 不支持 httpclient::create() 和 $response->toarray(),因其 httpclient 组件自 symfony 4.3 才引入;维护 symfony 2 项目对接百度 api 应使用 guzzle 6(兼容 php 5.6)或原生 curl,并需手动处理超时、json 解析及百度特有的业务错误字段(如 errno、error_code),不可仅依赖 http 状态码判断成功。

Symfony 2 不支持 HttpClient::create(),也不能直接用 toArray() 解析响应——它压根没有这些 API。 你如果正在维护一个 Symfony 2 项目并想对接百度 API,得换思路:别硬套现代 Symfony 的写法,否则会卡在类找不到、方法不存在、依赖注入失败上。
Symfony 2 里根本没有 HttpClient 组件
Symfony HttpClient 是从 Symfony 4.3 才引入的。Symfony 2(尤其是 2.8 LTS)连 HttpClient 类名都不存在,更别说 HttpClient::create() 或 $response->toArray()。试图照搬新文档代码,会立刻报错:Class 'Symfony\Component\HttpClient\HttpClient' not found。
你实际能用的只有:
- 原生
cURL(最直接,但要自己处理超时、重试、header 解析) -
GuzzleHttp\Client(需手动composer require guzzlehttp/guzzle:~6.0,注意 Guzzle 6 是 Symfony 2 兼容的最高版本;Guzzle 7+ 要求 PHP 7.2+,而 Symfony 2.8 官方只支持到 PHP 5.6) - Symfony 2 自带的
sf2-http-foundation不提供客户端能力,仅处理入站请求
用 Guzzle 6 获取百度 API 状态码的正确姿势
装好 Guzzle 6 后,获取状态码本身很简单,但容易忽略百度 API 的几个现实细节:
- 百度部分 API(如短网址、翻译)会在出错时返回
200 OK+ HTML 错误页,而不是标准4xx/5xx—— 所以不能只看$response->getStatusCode() - 百度有些接口要求
Content-Type: application/json;charset=UTF-8,漏设 header 可能返回乱码或 400 - 必须显式设置
timeout和connect_timeout,否则默认无限等待,请求会卡死
示例(在控制器中临时使用,后续应抽成服务):
$client = new \GuzzleHttp\Client([
'timeout' => 5.0,
'connect_timeout' => 3.0,
'headers' => ['User-Agent' => 'Symfony2-Baidu-Client']
]);
try {
$response = $client->get('https://api.baidu.com/v1/xxx');
$statusCode = $response->getStatusCode(); // 这才是真实 HTTP 状态码
$body = (string) $response->getBody();
// 注意:百度可能 status=200 但 body 是 {"error_code":1001,"reason":"invalid token"}
} catch (\GuzzleHttp\Exception\RequestException $e) {
$statusCode = $e->getResponse()->getStatusCode() ?? 0;
}
怎么判断百度 API 真正“成功”而非只是 HTTP 200?
百度多数开放接口遵循自己的错误协议:HTTP 状态码常为 200,业务错误藏在 JSON body 里,比如 {"errno":1,"errmsg":"invalid request"}。所以光看 getStatusCode() 没用。
- 先检查
Content-Type是否含json:$response->getHeader('Content-Type') - 再尝试
json_decode($body, true),并用json_last_error()判定是否解析失败(可能是百度返回了 HTML 登录页或 502 页面) - 若解析成功,检查返回数组里是否有
errno、error_code、status等百度惯用字段 - 不要依赖
isSuccess()方法——Guzzle 6 的$response->isSuccess()只判断 200–299,对百度无效
最常被跳过的点:百度 API 文档里写的“调用成功返回 200”,是它自己的定义,不是 HTTP 协议语义。你在 Symfony 2 里拿到的 200,很可能对应百度内部的 error_code=336001。状态码只是第一层,body 解析和字段校验才是关键。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











