# Using PSR-7 Clients

As noted in the previous section, you can [substitute your own HTTP client by implementing the ClientInterface](http-clients.md#clientinterface-and-headerawareclientinterface).
In this section, we'll demonstrate doing so in order to use a client that is
[PSR-7](http://www.php-fig.org/psr/psr-7/)-capable.

## Responses

zend-feed provides a facility to assist with generating a
`Zend\Feed\Reader\Response` from a PSR-7 `ResponseInterface` via
`Zend\Feed\Reader\Http\Psr7ResponseDecorator`. As such, if you have a
PSR-7-capable client, you can pass the response to this decorator, and
immediately return it from your custom client:

```php
return new Psr7ResponseDecorator($psr7Response);
```

We'll do this with our PSR-7 client.

## Guzzle

[Guzzle](http://docs.guzzlephp.org/en/latest/) is arguably the most popular HTTP
client library for PHP, and fully supports PSR-7 since version 5. Let's install
it:

```bash
$ composer require guzzlehttp/guzzle
```

We'll use the `GuzzleHttp\Client` to make our requests to feeds.

## Creating a client

From here, we'll create our client. To do this, we'll create a class that:

- implements `Zend\Feed\Reader\Http\ClientInterface`
- accepts a `GuzzleHttp\ClientInterface` to its constructor
- uses the Guzzle client to make the request
- returns a zend-feed response decorating the actual PSR-7 response

The code looks like this:

```php
use GuzzleHttp\Client;
use GuzzleHttp\ClientInterface as GuzzleClientInterface;
use Zend\Feed\Reader\Http\ClientInterface as FeedReaderHttpClientInterface;
use Zend\Feed\Reader\Http\Psr7ResponseDecorator;

class GuzzleClient implements FeedReaderHttpClientInterface
{
    /**
     * @var GuzzleClientInterface
     */
    private $client;

    /**
     * @param GuzzleClientInterface|null $client
     */
    public function __construct(GuzzleClientInterface $client = null)
    {
        $this->client = $client ?: new Client();
    }

    /**
     * {@inheritdoc}
     */
    public function get($uri)
    {
        return new Psr7ResponseDecorator(
			$this->client->request('GET', $uri)
		);
    }
}
```

## Using the client

In order to use our new client, we need to tell `Zend\Feed\Reader\Reader` about
it:

```php
Zend\Feed\Reader\Reader::setHttpClient(new GuzzleClient());
```

From this point forward, this custom client will be used to retrieve feeds.

## References

This chapter is based on [a blog post by Stefan Gehrig](https://www.teqneers.de/2016/05/zendfeedreader-guzzle-and-psr-7/).
