While working on a Laravel project in which repeated HTTP requests are made against several APIs,
I needed a simple and unobtrusive way to cache the multiple API responses for some time —
a time to live (TTL) specific for each API.
The project has a wrapper interface around Guzzle's ClientInterface and each
implementation of the former corresponds to one of the APIs the project is talking to.
This way I can manage all the requests in a likely fashion, while taking care of the
specifics of each API. I can, for example, instantiate the below GuzzleResponseCache
with a specific TTL.
The GuzzleResponseCache class is a Guzzle middleware,
which means that it handles the intermediary execution of a handler,
i.e. a function that modifies the request options and response of the HTTP request performed by Guzzle.
To make it work the GuzzleResponseCache middleware needs to be added to
a handler stack, which will be traversed while doing the request. Like so:
$guzzleHandlerStack = \GuzzleHttp\HandlerStack:create();
$cache = \Illuminate\Support\Facades\Cache::store('database');
$guzzleHandlerStack->push(new GuzzleResponseCache($cache, 86400));
$client = new \GuzzleHttp\Client([
handler => $guzzleHandlerStack
]);
This will cache all requests done with $client
for 24 hours in the database — making use
of Laravel's Cache
facade (provided you have migrated a cache table with artisan).