由于最近对第三方api需求量高的原因,不同的api对于curl请求稍微有点出入,而且多了显得代码冗余,为了整合统一请求调用,就开始使用Guzzle。
Guzzle介绍
Guzzle是一个PHP的HTTP客户端,用来轻而易举地发送请求,并集成到我们的WEB服务上。Guzzle中文文档
- 接口简单:构建查询语句、POST请求、分流上传下载大文件、使用HTTP cookies、上传JSON数据等等。
- 发送同步或异步的请求均使用相同的接口。
- 使用PSR-7接口来请求、响应、分流,允许你使用其他兼容的PSR-7类库与Guzzle共同开发。
- 抽象了底层的HTTP传输,允许你改变环境以及其他的代码,如:对cURL与PHP的流或socket并非重度依赖,非阻塞事件循环。
- 中间件系统允许你创建构成客户端行为。
安装
一般情况下,TP框架都会自带有,无需安装,如果没有的话,Composer安装 composer require guzzlehttp/guzzle
使用
基本的使用方法就不写了,可以直接到 Guzzle 查看文档,更详细。
注意:当我们使用form_params做键时,Guzzle会把params转化为http_build_query的字符参数。这里还是建议用Json,因为http_build_query会丢掉空值,而且连key一起丢掉。
响应
获取状态码:
1 2
| $code = $response->getStatusCode(); // 200 $reason = $response->getReasonPhrase(); // OK
|
获取响应获取头信息(header):
1 2 3 4 5 6 7 8 9 10 11 12
| // 检查头部是否存在 if ($response->hasHeader('Content-Length')) { echo "It exists"; }
// 获取返回头部信息 echo $response->getHeader('Content-Length');
// 获取所有返回头部信息 foreach ($response->getHeaders() as $name => $values) { echo $name . ': ' . implode(', ', $values) . "\r\n"; }
|
使用 getBody
方法可以获取响应的主体部分(body),主体可以当成一个字符串或流对象使用
1 2 3 4 5 6 7 8 9 10 11 12 13
| $body = $response->getBody();
// 隐式地将主体转换为字符串并回显 echo $body;
// 显式地将主体转换为字符串 $stringBody = (string) $body;
// 从正文中读取10个字节 $tenBytes = $body->read(10);
// 以字符串形式读取正文的其余内容 $remainingBytes = $body->getContents();
|
封装代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| /** * Guzzle请求 https://guzzle-cn.readthedocs.io/zh_CN/latest/ * @param $url 请求地址 * @param array $data 数据 * @param string $method 请求方法 * @param string $options 请求选项 [常用:GET=>query POST=>form_params POST=>json ] //https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html * @param array $headers 请求头 * @return array * @throws \GuzzleHttp\Exception\GuzzleException */ function guzzle_request($url, $data = [] , $method = "GET", $options = 'query' , $headers = []) { try { $client = new \GuzzleHttp\Client(); // array_unshift($headers,['content-type' => 'application/json;charset=utf-8']); $headers = array_merge(['content-type' => 'application/json;charset=utf-8'],$headers);
$parameter = [$options => $data, 'headers' => $headers];
$res = $client->request($method, $url, $parameter);
if ($res->getStatusCode() == 200) { $callback = json_decode($res->getBody()->getContents(),true); return ['code'=>200,'msg'=>'OK','data'=>$callback]; }else{ return ['code'=>500,'msg'=>'请求错误']; } } catch (\GuzzleHttp\Exception\RequestException $e) { // dd($e->getRequest());dd($e->getResponse()); return ['code'=>500,'msg'=>'出现异常']; } }
|