一、介绍
GuzzleHttp是一个基于PSR-7标准的PHP HTTP客户端,可以轻松地发送HTTP请求和快速处理响应。它是Guzzle 5和Guzzle 6的升级版。Guzzle 6需要PHP 5.5或更高版本。
GuzzleHttp使用可重用的连接池和Web服务完整性来加速请求,同时支持异步请求和PSR-7中间件。本文将详细介绍GuzzleHttp的使用。
二、安装和基本使用
首先需要在项目中加载GuzzleHttp的Composer包,执行以下命令:
composer require guzzlehttp/guzzle
然后,你可以使用GuzzleHttp客户端来创建和发送HTTP请求,例如发送GET请求:
use GuzzleHttp\Client;
$client = new Client();
$res = $client->request('GET', 'https://api.github.com/');
echo $res->getStatusCode(); // 200
echo $res->getHeaderLine('content-type'); // 'application/json; charset=utf8'
echo $res->getBody(); // '{"type":"User"...'
上述代码发送了一个GET请求到Github API,并打印出了响应状态码、Content-Type和响应主体。
三、请求配置
GuzzleHttp的请求配置都包含在一个关联数组中,可以使用request方法的第二个参数来传递配置:
$client = new Client();
$res = $client->request('GET', 'https://api.github.com/', [
'auth' => ['user', 'pass']
]);
上面的代码中,GuzzleHttp使用HTTP Basic身份验证发送了一个GET请求。请求配置还可以包括query、headers、body、timeout、verify(SSL证书验证)等参数。
四、响应处理
GuzzleHttp的响应是一个 Psr\Http\Message\ResponseInterface 实例,它包含了响应的所有信息。例如,响应状态码可以使用getStatusCode()方法获取:
use Psr\Http\Message\ResponseInterface;
$res = $client->request('GET', 'https://api.github.com/');
$status_code = $res->getStatusCode();
响应主体可以使用getBody()方法获取。如果响应是JSON格式,可以使用json_decode()函数转换成PHP对象或数组。
$body = $res->getBody();
$json = json_decode($body);
echo $json->name;
除此之外,GuzzleHttp还提供了更丰富的响应处理方法和异常处理机制。
五、同步和异步请求
在发送HTTP请求时,GuzzleHttp支持同步和异步两种方式。
同步请求在请求时会阻塞当前线程直到响应返回。异步请求允许在请求被发送后立即返回,并使用promise异步处理响应。Promise机制是一种处理异步操作的方式,可以在响应到达时触发回调处理。
$promise = $client->requestAsync('GET', 'https://api.github.com/users/darrenliu');
$promise->then(
function (ResponseInterface $res) {
echo $res->getStatusCode() . "\n";
},
function (RequestException $e) {
echo $e->getMessage() . "\n";
}
);
$promise->wait();
上面的代码使用requestAsync方法发送了一个异步请求,并在接收到响应后输出响应状态码。
六、中间件
中间件可以在请求发送前后对请求和响应进行处理,GuzzleHttp支持PSR-7中间件规范,可以使用Middleware提供的各种中间件,或者自定义中间件实现一些自己的处理逻辑。
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Middleware;
use Psr\Http\Message\RequestInterface;
$stack = new HandlerStack();
$stack->setHandler(\GuzzleHttp\choose_handler());
$stack->push(Middleware::mapRequest(function (RequestInterface $request) {
return $request->withHeader('X-Requested-With', 'XMLHttpRequest');
}));
$client = new Client(['handler' => $stack]);
$res = $client->request('GET', 'https://api.github.com/');
上面的代码使用Middleware::mapRequest方法在请求头添加了一个X-Requested-With的头部,并发送了一个GET请求到Github API。你也可以使用Middleware::mapResponse方法对响应进行处理。
七、连接池和性能
GuzzleHttp使用连接池共享连接资源来提高请求性能。默认情况下,GuzzleHttp会自动管理连接池。你也可以手动控制连接池的行为,包括最大连接数、等待时间等。
use GuzzleHttp\Pool;
$client = new Client();
$requests = function ($total) use ($client) {
$uri = 'https://httpbin.org/get';
for ($i = 0; $i getAsync($uri);
};
}
};
$pool = new Pool($client, $requests(10), [
'concurrency' => 5,
'fulfilled' => function ($response, $index) {
// 处理请求成功的响应
},
'rejected' => function ($reason, $index) {
// 处理请求失败的原因
},
]);
$pool->promise()->wait();
上面的代码使用Pool类发送了10个GET请求,并设置并发请求数为5个。通过Promise机制处理所有响应(成功或失败)。这种方式可以一次发送多个请求,大大提升性能。
八、异常处理
GuzzleHttp提供了详细的异常处理机制,可以在出现异常时进行有效的处理。例如:
use GuzzleHttp\Exception\RequestException;
try {
$res = $client->request('GET', 'https://null');
} catch (RequestException $e) {
echo $e->getRequest()->getMethod();
if ($e->hasResponse()) {
echo $e->getResponse()->getStatusCode();
}
}
上面的代码中,当请求函数抛出RequestException异常时,可以捕获该异常,并使用getRequest()和hasResponse()方法获取请求和响应对象。
九、总结
GuzzleHttp是一个功能强大的PHP HTTP客户端,可以轻松地发送HTTP请求和处理响应。它提供了丰富的配置、异步请求和中间件支持,可以满足各种HTTP请求的需求。在使用GuzzleHttp时,需要注意合理使用连接池、处理异常和提高性能等方面。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/229274.html