Zum Hauptinhalt springenZenit-Hosting Logo

Idempotenz

Bricht die Verbindung nach einem POST ab, weißt du nicht, ob der Aufruf angekommen ist. Mit einem Idempotency-Key wiederholst du ihn, ohne dass die Aktion doppelt läuft.

  • Idempotency-Key ist optional und für jeden POST-Aufruf empfohlen. Ohne den Header gibt es keine Idempotenz: Ein wiederholter Aufruf läuft dann ein zweites Mal.
  • Der Wert besteht aus 1 bis 128 sichtbaren ASCII-Zeichen. Ein leerer oder ungültiger Wert ergibt 400 VALIDATION_ERROR. Eine zufällige UUID eignet sich gut.
  • Ein Key ist 24 Stunden gültig, getrennt für jedes Token.
  • Erzeuge den Key einmal je Aktion und schicke bei jeder Wiederholung denselben.
cURL: Neustart mit Idempotency-Key
curl -X POST "https://api.zenit-hosting.de/api/developer/v1/servers/$SERVER_ID/power" \
  -H "Authorization: Bearer $ZENIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"signal": "restart"}'
JavaScript: Neustart mit Idempotency-Key
const BASE = 'https://api.zenit-hosting.de/api/developer/v1';

// Jede neue Aktion bekommt einen neuen Key. Nur beim Wiederholen derselben Aktion reichst du ihn weiter.
async function restart(serverId, key = crypto.randomUUID()) {
  return fetch(BASE + '/servers/' + serverId + '/power', {
    method: 'POST',
    headers: {
      Authorization: 'Bearer ' + process.env.ZENIT_TOKEN,
      'Idempotency-Key': key,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ signal: 'restart' }),
  });
}

async function restartWithRetry(serverId) {
  const key = crypto.randomUUID(); // ein Key je Aktion
  for (let attempt = 0; attempt < 3; attempt++) {
    try {
      return await restart(serverId, key); // bei jedem Versuch derselbe Key
    } catch {
      // Verbindungsfehler: Du weißt nicht, ob der Aufruf angekommen ist. Mit demselben Key ist die Wiederholung sicher.
    }
  }
  throw new Error('Neustart nicht bestätigt');
}

Was bei einer Wiederholung passiert

LageAntwort
Gleicher Key, gleicher Aufruf Die API liefert die gespeicherte Antwort noch einmal, mit dem Header Idempotency-Replayed: true. Die Aktion läuft nicht ein zweites Mal.
Gleicher Key, der erste Aufruf läuft noch 409 IDEMPOTENCY_IN_PROGRESS. Warte kurz und sende denselben Aufruf mit demselben Key erneut.
Gleicher Key, anderer Aufruf 422 IDEMPOTENCY_KEY_REUSED. Erzeuge für jede neue Aktion einen neuen Key.
Beispiel einer wiederholten Antwort
HTTP/1.1 202 Accepted
Idempotency-Replayed: true

{ "signal": "restart", "jobId": "b1f3c6d2-7a49-4e08-9c15-3d8e2a6f0b47", "deduped": false }

Welche Antworten gespeichert werden

Die API speichert Antworten mit einem Status unter 500. Ausgenommen sind 409 IDEMPOTENCY_IN_PROGRESS und 429. Ein Aufruf, der mit 429 oder einem Serverfehler endete, läuft deshalb bei einer Wiederholung mit demselben Key erneut. Wie du bei 429 wartest, steht unter Rate-Limits.

Nach einer Antwort unter 500 (außer 409 IDEMPOTENCY_IN_PROGRESS und 429) braucht ein neuer Versuch einen neuen Key. Mit dem alten Key bekämst du nur dieselbe gespeicherte Antwort noch einmal, etwa bei CAPACITY_UNAVAILABLE oder SERVER_NOT_READY.