Handlers and Middleware

Клиентите на Guzzle използват обработваща и междинна система за изпращане на HTTP заявки.

Handlers

Обработващата функция приема Psr\Http\Message\RequestInterface и масив от опции на заявката и връща GuzzleHttp\Promise\PromiseInterface, който е изпълнено с Psr\Http\Message\ResponseInterface или отхвърлено с изключение.

Можете да предоставите потребителски манипулатор на клиент, като използвате опцията handler на конструктор на клиент. Важно е да се разбере, че няколко заявки опции, използвани от Guzzle, изискват специфични междинни програми да опаковат използвания манипулатор от клиента. Можете да се уверите, че манипулаторът, който предоставяте на клиента, използва по подразбиране, като обвиете обработчика в GuzzleHttp\HandlerStack::create(callable $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]);

Методът create добавя манипулатори по подразбиране към HandlerStack. Когато HandlerStack се разреши, манипулаторите ще се изпълнят в следния ред:

  1. Изпращане на заявка:
  1. http_errors - Няма op при изпращане на заявка. Код на състоянието на отговора се проверява при обработката на отговора, когато се връща обещание за отговор нагоре в стека.
  2. allow_redirects - Няма опция при изпращане на заявка. Следващи пренасочвания възниква, когато обещанието за отговор се връща нагоре по стека.
  3. cookies - Добавя бисквитки към заявките.
  4. prepare_body - Тялото на HTTP заявката ще бъде подготвено (напр, ще се добавят заглавия по подразбиране като Content-Length, Content-Type и т.н.).
  5. <изпращане на заявка с манипулатор>
  1. Отговор на обработката:
  1. prepare_body - няма опция за обработка на отговора.
  2. cookies - извлича бисквитките за отговор в буркана за бисквитки.
  3. allow_redirects - Следи за пренасочвания.
  4. http_errors - хвърля изключения, когато кодът на състоянието на отговора >= 400.

Когато не е предоставен аргумент $handler, GuzzleHttp\HandlerStack::create() ще избере най-подходящия манипулатор въз основа на наличните разширения на вашата система.

Важно

Обработващото устройство, предоставено на клиента, определя как се прилагат опциите на заявката и се използват за всяка заявка, изпратена от клиент. Например, ако не нямате междинна програма за бисквитки, свързана с клиент, тогава задаването на бисквитки опцията за заявка няма да има ефект върху заявката.

Middleware

Мидълуерът разширява функционалността на манипулаторите, като ги извиква в в процеса на генериране на отговори. Междинното оборудване се реализира като по-висок ред функция, която има следната форма.

use Psr\Http\Message\RequestInterface;

function my_middleware()
{
    return function (callable $handler) {
        return function (RequestInterface $request, array $options) use ($handler) {
            return $handler($request, $options);
        };
    };
}

Функциите на междинното оборудване връщат функция, която приема следващия обработващ, който да бъде извикан. След това тази върната функция връща друга функция, която действа като съставна обработваща програма - тя приема заявка и опции и връща обещание, което е се изпълнява с отговор. Вашият съставен посредник може да модифицира заявката, да добавяте потребителски опции на заявката и да променяте обещанието, върнато от обработка.

Ето един пример за добавяне на заглавие към всяка заявка.

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);
        };
    };
}

След като е създаден междинен софтуер, можете да го добавите към клиент, като обвиете обработващия, използван от клиента, или като декорирате стек от обработващи.

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]);

Сега, когато изпратите заявка, клиентът ще използва манипулатор, съставен от добавения от вас междинен софтуер, който добавя заглавие към всяка заявка.

Ето един пример за създаване на междинна програма, която променя отговора на обработващия надолу по веригата. Този пример добавя заглавие към отговора.

use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Handler\CurlHandler;
use GuzzleHttp\Client;

function add_response_header($header, $value)
{
    return function (callable $handler) use ($header, $value) {
        return function (
            RequestInterface $request,
            array $options
        ) use ($handler, $header, $value) {
            $promise = $handler($request, $options);
            return $promise->then(
                function (ResponseInterface $response) use ($header, $value) {
                    return $response->withHeader($header, $value);
                }
            );
        };
    };
}

$stack = new HandlerStack();
$stack->setHandler(new CurlHandler());
$stack->push(add_response_header('X-Foo', 'bar'));
$client = new Client(['handler' => $stack]);

Създаването на междинно програмно осигуряване, което модифицира заявка, е много по-лесно с помощта на GuzzleHttp\Middleware::mapRequest() междинно оборудване. Този междинен софтуер приема функция, която приема аргумента заявка и връща заявката за изпращане.

use Psr\Http\Message\RequestInterface;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Handler\CurlHandler;
use GuzzleHttp\Client;
use GuzzleHttp\Middleware;

$stack = new HandlerStack();
$stack->setHandler(new CurlHandler());

$stack->push(Middleware::mapRequest(function (RequestInterface $request) {
    return $request->withHeader('X-Foo', 'bar');
}));

$client = new Client(['handler' => $stack]);

Модифицирането на отговора също е много по-просто с помощта на GuzzleHttp\Middleware::mapResponse() middleware.

use Psr\Http\Message\ResponseInterface;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Handler\CurlHandler;
use GuzzleHttp\Client;
use GuzzleHttp\Middleware;

$stack = new HandlerStack();
$stack->setHandler(new CurlHandler());

$stack->push(Middleware::mapResponse(function (ResponseInterface $response) {
    return $response->withHeader('X-Foo', 'bar');
}));

$client = new Client(['handler' => $stack]);

HandlerStack

Стекът от обработващи представлява стек от междинни програми, които се прилагат към базов обработващ. функция. Можете да избутвате междинен софтуер към стека, за да го добавите към върха на стека, и да отместите междинния софтуер върху стека, за да го добавите в долната част на стека. Когато стекът е разрешен, обработващата функция се избутва върху стека. Всяка стойност е след това се изскача от стека, като предишната стойност, изскачаща от стека, се стека.

use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Middleware;
use GuzzleHttp\Utils;
use Psr\Http\Message\RequestInterface;

$stack = new HandlerStack();
$stack->setHandler(Utils::chooseHandler());

$stack->push(Middleware::mapRequest(function (RequestInterface $r) {
    echo 'A';
    return $r;
}));

$stack->push(Middleware::mapRequest(function (RequestInterface $r) {
    echo 'B';
    return $r;
}));

$stack->push(Middleware::mapRequest(function (RequestInterface $r) {
    echo 'C';
    return $r;
}));

$client->request('GET', 'http://httpbin.org/');
// echoes 'ABC';

$stack->unshift(Middleware::mapRequest(function (RequestInterface $r) {
    echo '0';
    return $r;
}));

$client = new Client(['handler' => $stack]);
$client->request('GET', 'http://httpbin.org/');
// echoes '0ABC';

Можете да дадете име на междинния софтуер, което ви позволява да добавяте междинен софтуер преди друг именуван междинен софтуер, след друг именуван междинен софтуер или да премахнете междинен софтуер по име.

use Psr\Http\Message\RequestInterface;
use GuzzleHttp\Middleware;

// Add a middleware with a name
$stack->push(Middleware::mapRequest(function (RequestInterface $r) {
    return $r->withHeader('X-Foo', 'Bar');
}, 'add_foo'));

// Add a middleware before a named middleware (unshift before).
$stack->before('add_foo', Middleware::mapRequest(function (RequestInterface $r) {
    return $r->withHeader('X-Baz', 'Qux');
}, 'add_baz'));

// Add a middleware after a named middleware (pushed after).
$stack->after('add_baz', Middleware::mapRequest(function (RequestInterface $r) {
    return $r->withHeader('X-Lorem', 'Ipsum');
}));

// Remove a middleware by name
$stack->remove('add_foo');

Създаване на манипулатор

Както беше посочено по-рано, обработчикът е функция, която приема Psr\Http\Message\RequestInterface и масив от опции на заявката и връща GuzzleHttp\Promise\PromiseInterface, който се изпълнява с Psr\Http\Message\ResponseInterface или се отхвърля с изключение.

Обработващият отговаря за прилагането на следните Опции на заявката. Тези опции на заявката са подмножество на опциите на заявката, наречени "опции за прехвърляне".