1. Go to this page and download the library: Download tomb1n0/generic-api-client library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
tomb1n0 / generic-api-client example snippets
use GuzzleHttp\Psr7\HttpFactory;
use GuzzleHttp\Client as GuzzleHttpClient;
$api = new Client(
new GuzzleHttpClient(), // PSR-18 Client that sends the PSR-7 Request
new HttpFactory(), // A PSR-17 Request Factory used to create PSR-7 Requests
new HttpFactory(), // A PSR-17 Response Factory used to create PSR-7 Responses
new HttpFactory(), // A PSR-17 Stream Factory used to create the bodies of our PSR-7 requests
new HttpFactory(), // a PSR-17 URI Factory used to create URIs.
);
$requestFactory = new GuzzleHttp\Psr7\HttpFactory();
$request = $requestFactory->createRequest('GET', 'https://example.com');
$response = $api->send($request);
if ($response->successful()) {
// Do something with the response.
}
$client = $existingClient->withBaseUrl('https://dummyjson.com');
$response = $client->json('GET', '/products'); // Will make a request to https://dummyjson.com/products.
// Create a class that implements the PaginationHandlerContract
class PaginationHandler implements PaginationHandlerContract
{
public function hasNextPage(Response $response): bool
{
return $response->toPsr7Response()->hasHeader('next-page');
}
public function getNextPage(Response $response): RequestInterface
{
$originalRequest = $response->toPsr7Request();
$psr7Response = $response->toPsr7Response();
return $originalRequest->withHeader('page', $psr7Response->getHeaderLine('next-page'));
}
}
$handler = new PaginationHandler();
$client = $existingClient->withPaginationHandler($handler);
$response = $client->json('GET', 'https://dummyjson.com/products');
// HasNextPage will defer to the Pagination Handler to determine if the Response has a next page
if ($response->hasNextPage()) {
$nextPage = $response->getNextPage();
}
// For convenience, a helper is provided to fetch all pages in a loop:
$response->forEachPage(function (Response $response) {
// Do something with this pages response
});
class AuthenticationMiddleware implements MiddlewareContract
{
public function __construct(protected string $accessToken)
{
}
public function handle(RequestInterface $request, callable $next): ResponseInterface
{
// Mutate the request
$request = $request->withHeader('Authorization', 'Bearer ' . $this->accessToken);
// Call the next middleware in the chain, ultimately fetching the Response.
$response = $next($request);
// Can also mutate the Response here if desired.
$response = $response->withHeader('X-My-Header', 'Foo');
// Return the Response
return $response;
}
}
// Multiple middleware can be provided
$client = $existingClient->withMiddleware([
new AuthenticationMiddleware('my-access-token');
]);
// The request will be sent through our middleware in the order given.
$response = $client->json('GET', 'https://dummyjson.com/products');
// It is important to call fake first, as this returns a new client with a Fake PSR-18 client underneath.
$client = $existingClient->fake()->stubResponse(
'https://dummyjson.com/products',
[
'products' => [['id' => 1], ['id' => 2]],
],
200,
['X-Custom-Header' => 'Foo'],
);
$response = $client->json('GET', 'https://dummyjson.com/products');
if ($response->successful()) {
$products = $response->json('products');
}
$client = $existingClient->fake()->preventStrayRequests();
try {
// Make a request which has not been stubbed
$response = $client->json('GET', 'https://dummyjson.com/products');
} catch (NoMatchingStubbedResponseException $e) {
// a NoMatchingStubbedResponseException exception will be thrown.
}
$client = $existingClient->fake()->stubResponse('https://dummyjson.com/users', null, 200);
// This would likely be in some Service object method your test is calling.
$response = $client->json('POST', 'https://dummyjson.com/users', ['name' => 'Tom']);
// Assert we sent a request with the correct payload
$client->assertSent(function (RequestInterface $request) {
$contents = $request->getBody()->getContents();
$expected = ['name' => 'Tom'];
return $contents === $expected
});
class UrlMatcher implements FakeResponseMatcherContract
{
public function __construct(private string $url, private ?string $method = 'GET')
{
}
public function match(RequestInterface $request): bool
{
$requestUrl = (string) $request->getUri();
$requestMethod = $request->getMethod();
return $this->url === $requestUrl && $this->method === $requestMethod;
}
}