@@ -43,8 +43,18 @@ low-level HTTP client that makes requests, like the following ``GET`` request::
4343 $content = $response->toArray();
4444 // $content = ['id' => 521583, 'name' => 'symfony-docs', ...]
4545
46+ Performance Optimization
47+ ------------------------
48+
49+ The component is built for maximum HTTP performance. By design, it is compatible
50+ with HTTP/2 and with doing concurrent asynchronous streamed and multiplexed
51+ requests/responses. Even when doing regular synchronous calls, this design
52+ allows keeping connections to remote hosts open between requests, improving
53+ performance by saving repetitive DNS resolution, SSL negociation, etc.
54+ To leverage all these design benefits, the cURL extension is needed.
55+
4656Enabling cURL Support
47- ---------------------
57+ ~~~~~~~~~~~~~~~~~~~~~
4858
4959This component supports both the native PHP streams and cURL to make the HTTP
5060requests. Although both are interchangeable and provide the same features,
@@ -68,7 +78,7 @@ not configurable and cURL will be used automatically if the cURL PHP extension
6878is installed and enabled. Otherwise, the native PHP streams will be used.
6979
7080HTTP/2 Support
71- --------------
81+ ~~~~~~~~~~~~~~
7282
7383When requesting an ``https `` URL, HTTP/2 is enabled by default if libcurl >= 7.36
7484is used. To force HTTP/2 for ``http `` URLs, you need to enable it explicitly via
@@ -609,14 +619,55 @@ regular expression applied to relative URLs::
609619 'https://api\.github\.com/'
610620 );
611621
612- PSR-18 Compatibility
613- --------------------
622+ Interoperability
623+ ----------------
624+
625+ The component is interoperable with 2 different abstractions for HTTP clients:
626+ `Symfony Contracts `_ and `PSR-18 `_. If your app uses
627+ libraries that need any of them, the component is compatible with them.
628+ They also benefit from autowiring aliases when the
629+ :ref: `framework bundle <framework-bundle-configuration >` is used.
630+
631+ If you are writing or maintaining a library that makes HTTP requests, you can
632+ decouple it from any specific HTTP client implementations by coding against
633+ either Symfony Contracts (recommended) or PSR-18.
634+
635+ Symfony Contracts
636+ ~~~~~~~~~~~~~~~~~
637+
638+ The interfaces found in the ``symfony/http-client-contracts `` package define
639+ the primary abstractions implemented by the component. Its entry point is the
640+ :class: `Symfony\\ Contracts\\ HttpClient\\ HttpClientInterface `. That's the
641+ interface you need to code against when a client is needed::
642+
643+ use Symfony\Contracts\HttpClient\HttpClientInterface;
644+
645+ class MyApiLayer
646+ {
647+ private $client;
648+
649+ public function __construct(HttpClientInterface $client)
650+ {
651+ $this->client = $client
652+ }
653+
654+ // [...]
655+ }
656+
657+ All request options mentionned above (e.g. timeout management) are also defined
658+ in the wordings of the interface, so that any compliant implementations (like this
659+ component) is guaranteed to provide them. That's a major difference with the
660+ PSR-18 abstraction, which provides none related to the transport itself.
661+
662+ Another major feature covered by the Symfony Contracts is async/multiplexing,
663+ as described in the previous sections.
664+
665+ PSR-18
666+ ~~~~~~
614667
615- This component uses and implements abstractions defined by the
616- ``symfony/http-client-contracts ``. It also implements the `PSR-18 `_ (HTTP Client)
617- specifications via the :class: `Symfony\\ Component\\ HttpClient\\ Psr18Client `
618- class, which is an adapter to turn a Symfony ``HttpClientInterface `` into a
619- PSR-18 ``ClientInterface ``.
668+ This component implements the `PSR-18 `_ (HTTP Client) specifications via the
669+ :class: `Symfony\\ Component\\ HttpClient\\ Psr18Client ` class, which is an adapter
670+ to turn a Symfony ``HttpClientInterface `` into a PSR-18 ``ClientInterface ``.
620671
621672To use it, you need the ``psr/http-client `` package and a `PSR-17 `_ implementation:
622673
@@ -765,3 +816,4 @@ However, using ``MockResponse`` allows simulating chunked responses and timeouts
765816.. _`cURL PHP extension` : https://php.net/curl
766817.. _`PSR-17` : https://www.php-fig.org/psr/psr-17/
767818.. _`PSR-18` : https://www.php-fig.org/psr/psr-18/
819+ .. _`Symfony Contracts` : https://github.com/symfony/contracts
0 commit comments