OpenXE/classes/Components/HttpClient/docs/index.md

127 lines
4.9 KiB
Markdown
Raw Normal View History

2021-05-21 08:49:41 +02:00
# HTTP-Client
## Neue HttpClient-Instanz erzeugen
```php
/** @var \Xentral\Components\HttpClient\HttpClientFactory $factory */
$factory = $container->get('HttpClientFactory');
$client = $factory->createClient();
```
## Requests abschicken
```php
/** @var \Xentral\Components\HttpClient\HttpClientFactory $factory */
/** @var \Xentral\Components\HttpClient\HttpClientInterface $client */
$client = $factory->createClient();
$uri = 'https://httpbin.org/json';
$headers = ['Accept' => 'application/json'];
$request = new \Xentral\Components\HttpClient\Request\ClientRequest('GET', $uri, $headers);
try {
/** @var \Xentral\Components\HttpClient\Response\ServerResponseInterface $response */
$response = $client->sendRequest($request);
} catch (\Xentral\Components\HttpClient\Exception\TransferErrorExceptionInterface $exception) {
$request = $exception->getRequest();
$response = $exception->hasResponse() ? $exception->getResponse() : null;
// ...
}
```
## Request-Optionen
Mit den Request-Optionen kann das Standard-Verhalten des Http-Clients beeinflusst werden.
### Standard-Optionen
* Timeout: 0 Sekunden (kein Timeout)
* Umleitungen folgen: Maximal fünf Redirects
* Streaming-Verhalten: Deaktiviert (alles am Stück downloaden)
* SSL-Zertifikatsverifizierung: Aktiv
* HTTP-Protokollversion: 1.1
### Request-Optionen übergeben
Es gibt zwei Möglichkeiten Request-Optionen zu übergeben:
1. Beim Erzeugen der HttpClient-Instanz (`HttpClientFactory::createClient($options)`)
* Die Optionen gelten dann für alle Requests dieser Instanz.
2. Beim Abschicken eines Requests (`HttpClient::sendRequest($request, $options)`)
* Die Optionen werden nur für diesen Request angewendet.
Wenn an beiden Stellen Optionen übergeben werden, werden die Optionen zusammengefasst. Bei Konflikten haben die
Optionen Vorrang die beim Abschicken des Request übergeben werden (2. Möglichkeit).
### Beispiele
```php
$options = new \Xentral\Components\HttpClient\RequestOptions();
$options->setTimeout(5); // Maximal fünf Sekunden auf eine Antwort warten
$options->disallowRedirects(); // Keinen Umleitungen folgen
$options->setAuthDigest('username', 'password'); // Per DigestAuth authentifizieren
$options->setHeader('Accept', ['text/html', 'text/plain']); // Accept-Header setzen
```
#### Große Dateien downloaden
Für den Download von großen Dateien empfiehlt es sich die `setStorageLocation()`-Option zu verwenden.
Die Methode nimmt entweder einen Dateipfad oder ein `resource`-Objekt als Parameter entgegen.
Der Vorteil dieser Option besteht darin, dass der Response-Body direkt in eine Datei gestreamt wird.
Das führt zu einem sehr geringen Arbeitsspeicherbedarf.
```php
$options = new \Xentral\Components\HttpClient\RequestOptions();
$options->setStorageLocation('/tmp/large_file');
$response = $client->sendRequest($request, $options);
```
## Fehlerbehandlung
Im Fehlerfall wird standardmäßig eine Exception geworfen. Alle Exceptions implementieren
`\Xentral\Components\HttpClient\Exception\HttpClientExceptionInterface`.
Desweiteren gibt es spezielle Exceptions die bei HTTP-Protokollfehlern geworfen werden. Diese sind
alle von `\Xentral\Components\HttpClient\Exception\TransferErrorException` abgeleitet.
### Transfer-Fehler
* Verbindungsaufbau ist fehlgeschlagen
* Mögliche Ursachen: Gegenstelle ist nicht vorhanden (URL falsch/fehlerhaft), Gegenstelle momentan nicht
erreichbar, Routing-Fehler
* Klasse: `\Xentral\Components\HttpClient\Exception\ConnectionFailedException`
* HTTP-Client-Fehler (HTTP-Status 4xx)
* Die Ursache des Scheiterns liegt eher im Verantwortungsbereich des HTTP-Clients.
* Beispiel: Zugriff auf Resource ist nicht erlaubt (HTTP-Status 403)
* Klasse: `\Xentral\Components\HttpClient\Exception\ClientErrorException`
* HTTP-Server-Fehler (HTTP-Status 5xx)
* Die Ursache des Scheiterns liegt eher im Verantwortungsbereich der Gegenstelle (Server).
* Beispiel: Internal Server Error (HTTP-Status 500)
* Klasse: `\Xentral\Components\HttpClient\Exception\ServerErrorException`
* Zu viele Umleitungen
* In der Standard-Einstellung sind fünf Weiterleitungen erlaubt. Wird diese Zahl überschritten wird die
`TooManyRedirectsException` geworfen. In den Request-Optionen lässt sich die Anzahl der maximal erlaubten
Weiterleitungen festlegen.
* Klasse: `\Xentral\Components\HttpClient\Exception\TooManyRedirectsException`
### Transfer-Fehler-Exceptions deaktivieren
Über die Request-Optionen können Exceptions für HTTP-Protokollfehler deaktiviert werden.
```php
$options = new \Xentral\Components\HttpClient\RequestOptions();
$options->disableHttpErrorExceptions();
/** @var \Xentral\Components\HttpClient\HttpClientFactory $factory */
$factory = $container->get('HttpClientFactory');
$client = $factory->createClient($options);
$response = $client->request('GET', 'http://not_existing');
echo $response->getStatusCode(); // Ausgabe: 404
```