1. Go to this page and download the library: Download phpro/http-tools 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/ */
phpro / http-tools example snippets
use Phpro\HttpTools\Client\Configurator\PluginsConfigurator;
use Phpro\HttpTools\Client\Factory\AutoDiscoveredClientFactory;
use Phpro\HttpTools\Client\Factory\GuzzleClientFactory;
use Phpro\HttpTools\Client\Factory\SymfonyClientFactory;
$options = ['base_uri' => $_ENV['SOME_CLIENT_BASE_URI']];
$httpClient = AutoDiscoveredClientFactory::create($middlewares);
$httpClient = GuzzleClientFactory::create($guzzlePlugins, $options);
$httpClient = SymfonyClientFactory::create($middlewares, $options);
// If you are using guzzle, you can both use guzzle and httplug plugins.
// You can wrap additional httplug plugins like this:
$httpClient = PluginsConfigurator::configure($httpClient, $middlewares);
$middlewares = [
new Phpro\HttpTools\Plugin\AcceptLanguagePlugin('nl-BE'),
new App\SomeClient\Plugin\Authentication\ServicePrincipal($_ENV['API_SECRET']),
];
use Phpro\HttpTools\Formatter\RemoveSensitiveHeadersFormatter;
use Phpro\HttpTools\Formatter\RemoveSensitiveJsonKeysFormatter;
$middlewares[] = new Http\Client\Common\Plugin\LoggerPlugin(
$logger,
new RemoveSensitiveHeadersFormatter(
new RemoveSensitiveJsonKeysFormatter(
BasicFormatterFactory::create($debug = true, $maxBodyLength = 1000),
['password', 'oldPassword', 'refreshToken']
),
['X-Api-Key', 'X-Api-Secret']
)
);
use Phpro\HttpTools\Transport\Presets\JsonPreset;
use Phpro\HttpTools\Uri\TemplatedUriBuilder;
$transport = App\SomeClient\Transport\MyCustomTransportWrapperForDealingWithIsErrorPropertyEg(
JsonPreset::create(
$httpClient,
new TemplatedUriBuilder()
)
);
use Phpro\HttpTools\Transport\TransportInterface;
class ListSomething
{
public function __construct(
/**
* TransportInterface<array, array>
*/
private TransportInterface $transport
) {}
public function __invoke(ListRequest $request): ListResponse
{
// You could validate the result first + throw exceptions based on invalid content
// Tip : never trust APIs!
// Try to gracefully fall back if possible and keep an eye on how the implementation needs to handle errors!
return ListResponse::fromRawArray(
($this->transport)($request)
);
}
}
use Phpro\HttpTools\Request\RequestInterface;
// By wrapping the request in a Value Object, you can use named constructors to pass in filters and POST data.
// You can add multiple named constructors if you want the list to behave in different ways in some cases.
/**
* @implements RequestInterface<array>
*/
class ListRequest implements RequestInterface
{
public function method() : string
{
return 'GET';
}
public function uri() : string
{
return '/list{?query}';
}
public function uriParameters() : array
{
return [
'query' => 'somequery',
];
}
public function body() : array
{
return [];
}
}
// By wrapping the response in a Value Object, you can sanitize and normalize data.
// You could as well lazilly throw an exception in here if some value is missing.
// However, that's might be more of a task for a request-handler.
class ListResponse
{
public static function fromRawArray(array $data): self
{
return new self($data);
}
public function getItems(): array
{
// Never trust APIs!
return (array) ($this->data['items'] ?? []);
}
}
use Phpro\HttpTools\Transport\TransportInterface;
class FetchSomething
{
public function __construct(
/**
* TransportInterface<array, array>
*/
private TransportInterface $transport
) {}
public function __invoke(FetchRequest $request): Something
{
return Something::tryParse(
($this->transport)($data)
);
}
}
use Phpro\HttpTools\Transport\Presets\JsonPreset;
use Phpro\HttpTools\Uri\RawUriBuilder;
use Phpro\HttpTools\Uri\TemplatedUriBuilder;
use Veewee\Psr18ReactBrowser\Psr18ReactBrowserClient;
use function React\Async\async;
use function React\Async\await;
use function React\Async\parallel;
$client = Psr18ReactBrowserClient::default();
$transport = JsonPreset::create($client, new TemplatedUriBuilder());
$handler = new FetchSomething($transport);
$run = fn($id) => async(fn () => $handler(new FetchRequest($id)));
$things = await(parallel([
$run(1),
$run(2),
$run(3),
]));
use Http\Mock\Client;
use \Phpro\HttpTools\Test\UseMockClient;
class SomeTest extends TestCase
{
use UseMockClient;
protected function setUp(): void
{
// You can configure the mock client through a callback.
// Or you can skip the callback and configure the result of this method.
$this->client = $this->mockClient(function (Client $client): Client {
$client->setDefaultException(new \Exception('Dont call me!'));
return $client;
});
}
}
use Http\Client\Plugin\Vcr\NamingStrategy\PathNamingStrategy;
use Phpro\HttpTools\Client\Factory\AutoDiscoveredClientFactory;
use Phpro\HttpTools\Test\UseVcrClient;
class SomeTest extends TestCase
{
use UseVcrClient;
protected function setUp(): void
{
// Instead of the autodiscover client, you can use your own client factory.
// That way, you can e.g. add the
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.