由于最近对第三方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'=>'出现异常'];
}
}