Grenke ApiService
App\Services\Grenke\ApiService
Dünner Wrapper um Laravel Http-Facade. Hängt automatisch das X.509-Client-Zertifikat an, setzt Accept und Content-Type auf JSON, loggt jeden Fehler und rethrowt RequestException / RuntimeException.
DI
In jedem Controller / Action einfach injizieren:
use App\Services\Grenke\ApiService;
public function __construct(
protected ApiService $grenkeApiService
) {}
Methoden — Response
| Methode | Returns | Zweck |
|---|---|---|
get($uri, $query, $options) | Response | rohes Response-Objekt |
post($uri, $data, $options) | Response | |
put($uri, $data, $options) | Response | |
patch($uri, $data, $options) | Response | |
delete($uri, $data, $options) | Response |
Methoden — JSON
Bevorzugt nutzen, wenn JSON erwartet wird:
| Methode | Returns | Zweck |
|---|---|---|
getJson($uri, $query, $options) | array | (array) $response->json() ?? [] |
postJson($uri, $data, $options) | array | |
putJson($uri, $data, $options) | array | |
patchJson($uri, $data, $options) | array | |
deleteJson($uri, $data, $options) | array |
Beispiele
- GET
- POST
- PATCH
- PUT
- DELETE
$decoded = $this->grenkeApiService->getJson('contracts', [
'contractListParameter.pageSize' => 100,
'contractListParameter.state' => 'ReadyToSign',
]);
$items = $decoded['Items'] ?? [];
$response = $this->grenkeApiService->postJson('requests', $payload->toArray());
return RequestResponseData::fromArray($response);
$this->grenkeApiService->patchJson("requests/{$financingId}", [
'PaymentMethod' => 'Invoice',
]);
$this->grenkeApiService->putJson("requests/{$financingId}/cancel-e-signature");
$this->grenkeApiService->deleteJson("requests/{$financingId}");
URI-Konvention
Der Base-Path ist in .env (GRENKE_BASE_URL=https://demo-api.grenke.de/basic/v1/). Übergib der Methode also relative Pfade ohne führenden Slash:
$this->grenkeApiService->getJson('requests'); // ✅
$this->grenkeApiService->getJson('/requests'); // ✅ (Slash wird gestripped)
$this->grenkeApiService->getJson('basic/v1/requests'); // ❌ doppelt!
Error-Handling
Jeder fehlgeschlagene Call landet in Log::error() mit:
method,uri,query,json,options- HTTP
statusundresponse-Body (falls vorhanden) - Exception-
message
Bei Transport-Fehlern (Connection-Reset etc.) wird die ursprüngliche RequestException rethrowed. Bei unerwarteten Fehlern wird in eine RuntimeException mit verständlicher Message gewrappt.
try {
$result = $this->grenkeApiService->postJson('requests', $payload->toArray());
} catch (\Illuminate\Http\Client\RequestException $e) {
// HTTP 4xx/5xx von Grenke
$status = $e->response?->status();
$body = $e->response?->json();
} catch (\RuntimeException $e) {
// Transport / unerwartet
}
Anpassen / Erweitern
Wenn du z. B. einen anderen Base-Path brauchst (Production statt Demo) oder einen Mock injizieren willst, ist es wegen Http::withOptions(...) trivial. Im Test:
Http::fake([
'demo-api.grenke.de/basic/v1/requests' => Http::response([
'FinancingId' => 'F-123',
'State' => 'ReadyToSign',
], 201),
]);