Guzzle-klienter använder en handläggare och ett middleware-system för att skicka HTTP-begäranden.
En hanterarfunktion accepterar ett Psr\Http\Message\RequestInterface
och en matris av
och returnerar ett GuzzleHttp\Promise\PromiseInterface
som är
uppfylls med ett Psr\Http\Message\ResponseInterface
eller avvisas med ett Psr\Http\Message\ResponseInterface
.
undantag.
Du kan tillhandahålla en anpassad handläggare till en klient genom att använda alternativet handler
i
en klientkonstruktör. Det är viktigt att förstå att flera begäran
som används av Guzzle kräver att specifika mellanprogram sveper in den handläggare som används
av klienten. Du kan se till att den handläggare som du tillhandahåller en klient använder alternativet
genom att omsluta handläggaren i
GuzzleHttp\HandlerStack::create(callable $handler = null)
statisk metod.
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]);
Metoden create
lägger till standardhanterare till HandlerStack
. När HandlerStack
är löst kommer handläggarna att utföras i följande ordning:
http_errors
- Ingen op när en begäran skickas. Statuskoden för svaret kontrolleras i svarsbehandlingen när ett svarslöfte returneras. stacken.allow_redirects
- Inget op när en begäran skickas. Följande omdirigeringar sker när ett svarslöfte returneras uppåt i stacken.cookies
- Lägger till cookies i begäranden.prepare_body
- Kroppen för en HTTP-förfrågan förbereds (t.ex., lägga till standardrubriker som Content-Length, Content-Type etc.).- <skicka begäran med handläggare>
prepare_body
- inga åtgärder för svarsbehandling.cookies
- hämtar svarscookies i kakburken.allow_redirects
- Följer omdirigeringar.http_errors
- kastar undantag när svarsstatuskoden>=
400.
När inget $handler
argument tillhandahålls, GuzzleHttp\HandlerStack::create()
kommer att välja den lämpligaste hanteraren baserat på de tillägg som finns tillgängliga på
ditt system.
Viktigt
Den handläggare som tillhandahålls en klient avgör hur begäran alternativ tillämpas.
och används för varje begäran som skickas av en klient. Om du till exempel inte
har en cookie middleware associerad med en klient, kan du ställa in
cookies
har ingen effekt på begäran.
Middleware utökar funktionaliteten hos handläggare genom att åberopa dem i den processen att generera svar. Middleware implementeras som en högre ordning funktion som har följande form.
use Psr\Http\Message\RequestInterface;
function my_middleware()
{
return function (callable $handler) {
return function (RequestInterface $request, array $options) use ($handler) {
return $handler($request, $options);
};
};
}
Middleware-funktioner returnerar en funktion som accepterar nästa handläggare att anropa. Den returnerade funktionen returnerar sedan en annan funktion som fungerar som en sammansatt handläggare - den tar emot en begäran och alternativ och returnerar ett löfte som är uppfylls med ett svar. Din sammansatta middleware kan ändra begäran, lägga till egna alternativ för begäran och ändra det löfte som returneras av den nedströmsbaserade handläggaren.
Här är ett exempel på att lägga till en rubrik till varje begäran.
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);
};
};
}
När en middleware har skapats kan du lägga till den i en klient genom att antingen omsluta den handläggare som används av klienten eller genom att dekorera en handläggarstack.
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]);
När du skickar en begäran kommer klienten att använda en handläggare som är sammansatt med din tillagda middleware och som lägger till en rubrik till varje begäran.
Här är ett exempel på att skapa en middleware som ändrar svaret från nedströmshanteraren. I det här exemplet läggs en rubrik till svaret.
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]);
Det är mycket enklare att skapa en middleware som ändrar en begäran med hjälp av
GuzzleHttp\Middleware::mapRequest()
. Denna middleware accepterar
en funktion som tar emot argumentet för begäran och returnerar den begäran som ska skickas.
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]);
Det är också mycket enklare att ändra ett svar med hjälp av 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]);
En handläggarstack representerar en stack av mellanprogram som ska tillämpas på en bashandläggare. funktion. Du kan lägga till mellanprogram i stapeln för att lägga till toppen av stapeln, och ta bort middleware från stapeln för att lägga till längst ner i stapeln. När stapeln är löst, skjuts handläggaren upp på stapeln. Varje värde är från stapeln, och det föregående värdet som tagits bort från stapeln läggs om till stacken.
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';
Du kan ge middleware ett namn, vilket gör att du kan lägga till middleware innan du andra namngivna middleware, efter andra namngivna middleware eller ta bort middleware efter namn.
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');
Som tidigare nämnts är en handläggare en funktion som accepterar en
Psr\Http\Message\RequestInterface
och en matris av förfrågningsalternativ och returnerar
ett GuzzleHttp\Promise\PromiseInterface
som uppfylls med en
Psr\Http\Message\ResponseInterface
eller avvisas med ett undantag.
En handläggare ansvarar för att tillämpa följande Förfrågningsalternativ. Dessa begärselalternativ är en delmängd av de begärselalternativ som kallas "överföringsalternativ".