PHP HTTP客户端: Guzzle
嘻嘻发布于2020-03-22
最后更新于2020年3月3日
浏览Guzzle是一个PHP HTTP客户端,它使发送HTTP请求变得容易,与web服务集成也变得简单。
特性
- 接口简单,用于建立查询字符串,POST请求,流式大上传,流-式大下载,使用HTTP cookie,上传JSON数据,等等…
- 可以使用相同的接口发送同步和异步请求。
- 为请求、响应和流使用PSR-7接口。这允许您使用其他与Guzzle兼容的PSR-7库。
- 抽象出底层的HTTP传输,允许您编写与环境和传输无关的代码;即。不依赖于cURL、PHP流、套接字或非阻塞事件循环。
- 中间件系统允许您扩展和组合客户端行为。
官网的例子:
$client = new GuzzleHttp\Client();
$res = $client->request('GET', 'https://api.github.com/user', [
'auth' => ['user', 'pass']
]);
echo $res->getStatusCode();
// "200"
echo $res->getHeader('content-type')[0];
// 'application/json; charset=utf8'
echo $res->getBody();
// {"type":"User"...'
// Send an asynchronous request.
$request = new \GuzzleHttp\Psr7\Request('GET', 'http://httpbin.org');
$promise = $client->sendAsync($request)->then(function ($response) {
echo 'I completed! ' . $response->getBody();
});
$promise->wait();
Handlers和Middleware 中间件
Guzzle客户端使用处理程序和中间件系统发送HTTP请求。
Handlers
处理函数接受一个Psr\Http\Message\RequestInterface和请求选项数组,并返回一个GuzzleHttp\Promise\Promise einterface,该接口由一个Psr\Http\Message\ResponseInterface实现,或在异常情况下被拒绝。
您可以使用客户端构造函数的处理程序选项向客户端提供自定义处理程序。Guzzle使用的几个请求选项要求特定的中间件封装客户端使用的处理程序,理解这一点很重要。通过在GuzzleHttp\HandlerStack::create(可调用的$handler = null)静态方法中包装处理程序,您可以确保为客户端提供的处理程序使用默认的中间件。
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Handler\CurlHandler;
$handler = new CurlHandler();
$stack = HandlerStack::create($handler); // Wrap w/ middleware
$client = new Client(['handler' => $stack]);
Middleware
中间件通过在生成响应的过程中调用处理程序来增强处理程序的功能。中间件被实现为具有以下形式的高阶函数。
use Psr\Http\Message\RequestInterface;
function add_header($header, $value)
{
return function (callable $handler) use ($header, $value) {
return function (
RequestInterface $request,
array $options
) use ($handler, $header, $value) {
$request = $request->withHeader($header, $value);
return $handler($request, $options);
};
};
}
Demo:
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Handler\CurlHandler;
use GuzzleHttp\Client;
$stack = new HandlerStack();
$stack->setHandler(new CurlHandler());
$stack->push(add_header('X-Foo', 'bar'));
$client = new Client(['handler' => $stack]);