HTTP-Clients
Zwei generische Low-Level-Clients liegen unter app/Http/Clients/:
app/Http/Clients/
├── GuzzleClient.php # HTTP Basic Auth, JSON
└── ODataClient.php # OData v4 (saint-systems/odata-client)
Für Grenke gibt es einen eigenen, schlanken Client (
Services\Grenke\ApiService), weil dieser X.509-Zertifikate als Auth braucht. Siehe Grenke ApiService.
GuzzleClient
Wrapper um GuzzleHttp\Client mit HTTP-Basic-Auth. Konfiguriert sich aus config('services.<client>').
namespace App\Http\Clients;
$mfr = new GuzzleClient('mfr'); // 'mfr' → config('services.mfr.{username,password,base_url}')
Methoden
- GET
- POST
- PUT
- PATCH
- DELETE
$result = $mfr->get('Companies(61149446314L)');
// $result = ['status' => 200, 'reason' => 'OK', 'headers' => [...], 'body' => stdClass]
$body = json_encode(['Id' => '...', 'Version' => 1]);
$result = $mfr->post('Companies', $body);
$result = $mfr->put('Companies(61149446314L)', $company->toJson());
$result = $mfr->patch('Companies(61149446314L)', $body);
$result = $mfr->delete('Companies(61149446314L)');
Response-Shape
Jede Methode liefert ein Array oder bei Fehler eine JsonResponse:
[
'status' => 200,
'reason' => 'OK',
'headers' => [...],
'bodyLen' => 1234,
'body' => stdClass, // json_decode'd, NICHT als Array
]
⚠️
bodyist einstdClass-Objekt, kein Array. Property-Zugriff ist$result['body']->Id, nicht$result['body']['Id'].
Wann nehme ich welchen Client?
| Use-Case | Client |
|---|---|
| MFR-Resource schreiben (POST/PUT) | GuzzleClient('mfr') |
MFR komplexer Query mit expand | ODataClient (siehe unten) |
| Weclapp | Services\WeclappApiService |
| Grenke | Services\Grenke\ApiService |
ODataClient
Wrapper für saintsystems/odata-client-php, vorkonfiguriert für MFR. Wird in MfrApiService injiziert.
use App\Http\Clients\ODataClient;
// Variante A
$mfr = new ODataClient('mfr');
// Variante B (mfr ist auch property)
$client = new ODataClient();
$mfr = $client->mfr;
Query-Beispiele
// Liste mit OData-Operatoren
$companies = $mfr->from('Companies')
->skip(10)
->order('ExternalId')
->expand('Contacts,Tags,ServiceObjects,MainContact')
->get();
$companies->each(fn ($c) => print $c->Id);
// Filter
$active = $mfr->from('ServiceObjects')
->where('Active', true)
->get();
// CRUD
$mfr->post('Companies', $payload);
$mfr->put('Companies(61149446314L)', $payload);
$mfr->delete('Companies(61149446314L)');
Vollständige OData-Syntax: https://github.com/saintsystems/odata-client-php/wiki/Example-Calls
Configuration
Beide Clients lesen aus config/services.php:
'mfr' => [
'base_url' => rtrim(env('MFR_BASE_URL'), '/') . '/',
'username' => env('MFR_API_USERNAME'),
'password' => env('MFR_API_PASSWORD'),
],
Setze in .env:
MFR_BASE_URL="https://portal.mobilefieldreport.com/odata/"
MFR_API_USERNAME="..."
MFR_API_PASSWORD="..."