camoo / curl-http-client
Simple Curl Http Client
1.2.0
2026-09-12 12:15 UTC
Requires
- php: >=8.0
- ext-curl: *
- ext-json: *
- camoo/http-header-parser: ^1.0
- psr/http-message: ^1.1
Requires (Dev)
- phpunit/phpunit: ^9
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Simple Curl Http Client build with the clean code architecture approach. PSR-7 standard
Usage
without dependency injection
use Camoo\Http\Curl\Infrastructure\Client; use Camoo\Http\Curl\Domain\Entity\Configuration; $configuration = Configuration::create(); // activate debug // $configuration->setDebug(true); $client = new Client($configuration); $uri = 'https://api.example.com/v1/users'; $response = $client->get($uri); $status = $response->getStatusCode(); $body = (string)$response->getBody(); // get all headers $headers = $response->getHeaders(); // get single header $header = $response->getHeader('foo'); // get status code $code = $response->getStatusCode();
With dependency injection
## in Module use Camoo\Http\Curl\Domain\Client\ClientInterface; use Camoo\Http\Curl\Infrastructure\Client; $this->bind(ClientInterface::class)->to(Client::class); ## in Adapter port final class TemplateRepository implements TemplateRepositoryInterface { private const URI = 'https://api.example.com/v2/template'; private const SUCCESS_STATUS = 201; public function __construct(private readonly ClientInterface $client) { } public function save(Template $template): bool { $response = $this->client->post(self::URI, $template->toArray()); return $response->getStatusCode() === self::SUCCESS_STATUS; } public function getById(string $id): Template { $uri = self::URI. '?id=' . $id; $response = $this->client->get($uri); if ($response->getStatusCode() !== self::SUCCESS_STATUS){ throw new NotFoundTemplate(sprintf('Template with id %s not found!', $id)); } $body = (string)$response->getBody(); return Template::fromArray(json_decode($body, true)); } # ... }
Concurrent Requests with MultiCurl and MultiCurlPromise
Execute multiple HTTP requests in parallel using MultiCurl and MultiCurlPromise.
use Camoo\Http\Curl\Infrastructure\MultiCurl; $multiCurl = new MultiCurl(); // Add parallel requests $promise1 = $multiCurl->get('https://api.example.com/v1/users'); $promise2 = $multiCurl->post('https://api.example.com/v1/data', ['name' => 'foo']); // Attach promise callbacks if desired $promise1->then(function ($response) { echo "Users status: " . $response->getStatusCode(); }); // Execute all pending requests concurrently $responses = $multiCurl->send(); // Or wait directly on a specific promise $response2 = $promise2->wait();
Running with Docker Compose
docker compose run --rm app composer install docker compose run --rm app vendor/bin/phpunit