# Transport HTTP

`GuzzleRelaiHttpClient` implémente l'interface publique `HttpClient`.

## Garanties

- concaténation de `baseUrl` et du chemin Core;
- bearer token, `Accept` et `Content-Type` JSON;
- headers réservés protégés sans distinction de casse;
- body via l'option Guzzle `json`;
- query via l'option Guzzle `query`;
- `http_errors=false` pour conserver tous les bodies;
- timeout et connect timeout identiques;
- JSON décodé avec `JSON_THROW_ON_ERROR`.

Une réponse 204/vide devient `[]`. Un succès JSON non objet ou non JSON produit
`RelaiValidationException`. Une erreur non-2xx produit `RelaiApiException` avec JSON
parsable ou texte brut.

## Transport custom

```php
final class MyHttpClient implements HttpClient
{
    public function request(
        string $method,
        string $path,
        array $body = [],
        array $query = [],
        array $headers = [],
    ): array {
        // transport interne
    }
}

$relai = new RelaiClient($options, httpClient: new MyHttpClient());
```

Le transport custom doit reproduire l'authentification et la hiérarchie d'erreurs si
les mêmes garanties sont attendues.

Le SDK ne retry pas automatiquement : un POST peut avoir été persisté avant une
rupture réseau. Utilisez un backoff applicatif borné uniquement après analyse de
l'idempotence.
