Skip to main content

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

MethodeReturnsZweck
get($uri, $query, $options)Responserohes 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:

MethodeReturnsZweck
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

$decoded = $this->grenkeApiService->getJson('contracts', [
'contractListParameter.pageSize' => 100,
'contractListParameter.state' => 'ReadyToSign',
]);
$items = $decoded['Items'] ?? [];

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 status und response-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),
]);