Resolver-Fehler kommen mit HTTP 200 an
Das ist das Wichtigste, was Sie wissen sollten, bevor Sie Ihre Fehlerbehandlung schreiben. Gemäß der Spezifikation für GraphQL over HTTP gibt eine Anfrage, die unsere Resolver erreicht, HTTP 200 zurück, selbst wenn eine Operation fehlgeschlagen ist. Der Fehler wird im Antwort-Body gemeldet, nicht über den Statuscode. Diese Prüfung funktioniert daher nicht:Content-Type, haben einen leeren Body. Prüfen Sie daher vor dem Parsen, ob die Antwort JSON ist:
- Eine fehlerhafte Anfrage gibt einen Fehlerstatus zurück: HTTP 400 bei ungültigem JSON oder fehlender
query, 413 bei einem Body über 64 KB, 405 bei einer anderen Methode alsPOSTund 415 bei einem nicht unterstütztenContent-Type. - Eine Query, die für das Schema nicht gültig ist, gibt nur dann HTTP 400 zurück, wenn Ihre Anfrage
Accept: application/graphql-response+jsonsendet. Das betrifft Syntaxfehler, unbekannte Felder, falsche Argumenttypen, ungültige Enum-Werte und Queries, die die Abfragelimits überschreiten. Wenn SieAccept: application/jsonoder keinenAccept-Header senden, gibt derselbe Fehler HTTP 200 zurück. In beiden Fällen enthält der Body einerrors-Array und keindata.
errors-Array zurück.
Die Fehlerstruktur
Jeder Resolver-Fehler enthält seinen HTTP-ähnlichen API-Status inextensions:
message– eine lesbare Beschreibung. Wir entfernen API Keys und andere Zugangsdaten aus Resolver-Fehlermeldungen, aber ein Fehler zu einem von Ihnen gesendeten Wert, etwa einer Variablen mit falschem Typ, kann diesen Wert wiederholen. Behandeln Siemessageals potenziell sensibel, bevor Sie sie protokollieren.path– welches Feld in Ihrer Query fehlgeschlagen ist. Bei mehreren Feldern in einer Anfrage erkennen Sie daran, welches betroffen ist.extensions.status– der HTTP-Status, den der entsprechende REST-Aufruf zurückgegeben hätte. Verzweigen Sie anhand dieses Werts.extensions.code– der numerische Ayrshare-Fehlercode, sofern der zugrunde liegende Endpunkt einen liefert.extensions.retryAfter– vorhanden bei Upstream-429-Fehlern wegen Kontingent oder Rate-Limit, wenn eine Wartezeit für die Wiederholung verfügbar ist. Beim 429 des Dispatch-Budgets pro Anfrage ist es nicht vorhanden.
extensions.code mit der Referenz der Fehlercodes oder übergeben Sie ihn an explainError.
Teilerfolg
Wenn eine Anfrage nach mehreren Dingen fragt und nur einige davon erfolgreich sind, erhalten Sie sowohldata als auch errors:
history war erfolgreich, und seine Daten sind verwendbar. Nur analytics muss wiederholt werden. Verwerfen Sie nicht die gesamte Antwort, nur weil errors vorhanden ist – damit würden Sie Daten wegwerfen, die Ihnen bereits berechnet wurden.
Teilerfolg bei Beiträgen in mehreren Netzwerken
Ein Beitrag in mehreren Netzwerken kann in einigen erfolgreich sein und in anderen fehlschlagen. Das wird nicht als GraphQL-Fehler gemeldet, weil die Operation selbst funktioniert hat – sie hat genau das getan, was Sie angefordert haben, und teilt Ihnen mit, was passiert ist. Das Ergebnis trennt die drei möglichen Ausgänge:postIds– Netzwerke, in denen veröffentlicht wurde, mit ihren Beitrags-URLs. Nur Erfolge.errors– Netzwerke, in denen es fehlgeschlagen ist, mit dem Grund.blocked– Netzwerke, die vor einem Versuch gestoppt wurden, zum Beispiel durch den netzwerkspezifischen Circuit Breaker nach wiederholten deterministischen Fehlern. Diese sind getrennt von Anbieterversuchen, die Fehler zurückgegeben haben.
status ist "error", wenn irgendein Netzwerk fehlgeschlagen ist. Es ist also kein verlässliches Signal dafür, dass nichts veröffentlicht wurde. Lesen Sie postIds, um herauszufinden, was veröffentlicht wurde.
Wiederholungen
Die GraphQL-API wiederholt niemals automatisch. Wenn eine Anfrage fehlschlägt, wurde in Ihrem Namen nichts unbemerkt erneut versucht. Das ist vor allem bei Mutations wichtig.createPost stellt idempotencyKey bereit: Erzeugen Sie vor dem ersten Versuch einen eindeutigen Schlüssel und verwenden Sie dann denselben Schlüssel und dieselbe Nutzlast für jede Wiederholung. Eine abgeschlossene Wiederholung liefert das ursprüngliche Ergebnis erneut, statt den Schreibvorgang zu wiederholen. Wechseln Sie nach einer uneindeutigen Antwort nicht zu einem neuen Schlüssel.
boostFacebookPost und instagramBoostPost nehmen ebenfalls einen idempotencyKey entgegen, und er schützt echtes Geld. Eine Wiederholung mit demselben Schlüssel und denselben Argumenten gibt das ursprüngliche Ergebnis zurück, markiert mit idempotentReplayed: true, statt eine zweite Anzeige zu erstellen und zu bezahlen. Ein Schlüssel gilt für Ihr gesamtes Konto auf beiden Meta-Plattformen. Verwenden Sie den Schlüssel eines Facebook-Boosts daher niemals für einen Instagram-Boost.
Wenn ein Schlüssel abgelehnt wird, verrät Ihnen extensions.status den Grund. createPost gibt 409 zurück, solange der erste Versuch noch verarbeitet wird – warten Sie dann und wiederholen Sie mit demselben Schlüssel –, und 400, wenn sich die Nutzlast vom ersten Versuch unterscheidet. Die Boost-Mutations geben in beiden Fällen 409 zurück, und ebenso, wenn der Schlüssel für einen Boost auf der anderen Plattform verwendet wurde.
Andere Schreibvorgänge, etwa addComment, haben keinen Idempotenzschlüssel. Wenn ihre Antwort verloren geht, prüfen Sie den Zustand im sozialen Netzwerk oder in der API, bevor Sie entscheiden, ob ein weiterer Versuch sicher ist.
Zwei verschiedene Limits melden beide 429 und erfordern eine unterschiedliche Behandlung. Das Dispatch-Budget lehnt Root-Felder erst ab, wenn in derselben Anfrage bereits fünf API-Aufrufe gestartet wurden, und seine Meldung beginnt mit Query exceeds the per-request dispatch budget: Teilen Sie diese Felder auf Anfragen mit höchstens fünf Feldern auf, ohne warten zu müssen. Jeder andere 429 ist ein Rate-Limit oder Kontingent: Warten Sie extensions.retryAfter Sekunden, wenn der Wert vorhanden ist, andernfalls warten Sie vor der Wiederholung schrittweise länger, und wiederholen Sie nur die fehlgeschlagenen Felder. Bei einem 5xx bei einem Lesevorgang ist eine Wiederholung sicher, mit einer Ausnahme: generatePost ist eine Query, aber eine Wiederholung ruft den KI-Generator erneut auf, zählt als weiterer API-Aufruf und gibt einen anderen Text zurück. Bei einem 5xx bei einem Schreibvorgang ohne Idempotenz prüfen Sie vor der Wiederholung, ob er wirksam wurde.
Häufige Statuswerte
Fehler, die GraphQL selbst vor der Ausführung auslöst, etwa ein unbekanntes Feld, ein falscher Argumenttyp oder ein ungültiger Enum-Wert, haben keinen
extensions.status. Sie geben je nach Ihrem Accept-Header HTTP 400 oder 200 zurück, wie oben beschrieben. Sie bedeuten, dass die Query selbst falsch ist, und es wurde kein API-Aufruf ausgeführt oder berechnet.