GH GambleHub

Κώδικες σφάλματος API και βέλτιστες πρακτικές

1) Γιατί να τυποποιηθούν τα σφάλματα

Προβλεψιμότητα για τους πελάτες: μια ενιαία μορφή και συμπεριφορά των ρετρα.
Επιτάχυνση αποσφαλμάτωσης: 'trace _ id '/' request _ id', stable 'error _ code'.
Ασφάλεια: SQL/στοίβα ίχνη/ρυθμίσεις δεν θα διαρρέουν.
Παρατήρηση: υποβολή εκθέσεων σχετικά με την ταξινόμηση σφαλμάτων (επικύρωση, ποσοστώσεις, χρονοδιαγράμματα κ.λπ.).

2) Βασικές αρχές

1. Ένα ενιαίο μορφότυπο απόκρισης για όλα τα 4xx/5xx (και για τα 2xx με μερικά σφάλματα - ένα ξεχωριστό σχήμα).
2. Καθαρισμός σημασιολογίας HTTP: η σωστή κατάσταση είναι πιο σημαντική.
3. Δύο επίπεδα κώδικα: μεταφορά ('status') και πεδίο σταθερό 'error _ code'.
4. Retribable vs Non-retrible: προσδιορίστε ρητά και δώστε μια υπόδειξη για το back-off.
5. Προεπιλεγμένη ασφάλεια: λεπτομέρειες - μόνο για τον πελάτη με δικαιώματα· χωρίς εσωτερικά ίχνη.
6. Τοπικοποίηση: ο κώδικας μηχανών παραμένει σταθερός, κείμενο - μεταφράζουμε.

3) Ενιαίο μορφότυπο σφάλματος (βάσει RFC 7807)

Συνιστώμενη JSON (επέκταση 'application/problem + json'):
json
{
"type": "https://api. example. com/errors/validation_failed",
"title": "Validation failed",
"status": 422,
"error_code": "VAL_001",
"detail": "Field 'email' must be a valid address",
"instance": "req_01HZY...93",
"trace_id": "a1b2c3d4e5f6",
"retriable": false,
"errors": [
{"field": "email", "code": "email_invalid", "message": "Invalid email"}
],
"hint": "Fix payload and retry",
"meta": {"docs": "https://docs. example. com/errors#VAL_001"}
}

Απαιτείται: 'type', 'title', 'status', 'error _ code', 'trace _ id'.
Προαιρετικά: 'σφάλματα []' (από πεδία), 'επαναφορτιζόμενα', 'υπόδειξη', 'μετα'.

Κεφαλίδες ως απάντηση:
  • 'Τύπος περιεχομένου: εφαρμογή/πρόβλημα + json'
  • «X-Request-ID »/« Traceparent» (W3C)
  • (για 429/503) «Επανάληψη» (δευτερόλεπτα ή ημερομηνία)

4) Σημασιολογία των καταστάσεων HTTP (συγχώνευση «κλασικών» και πρακτικής)

2xx (επιτυχία)

200 OK είναι μια κοινή επιτυχία.
Δημιουργήθηκε 201 - Τοποθεσία.
202 Αποδεκτή - ασύγχρονα στην ουρά (δώστε 'status _ url').
Multi-Status - μερική επιτυχία (αποφύγετε αν είναι δυνατόν).

4xx (σφάλμα πελάτη)

400 Κακή αίτηση - σύνταξη/μορφή, αλλά όχι επικύρωση πεδίου (κατά προτίμηση 422).
401 Μη εξουσιοδοτημένη - όχι/άκυρη μάρκα. Ας 'WWW-Authenticate'.
403 Απαγορευμένη - η μάρκα είναι έγκυρη, αλλά δεν υπάρχουν αρκετά δικαιώματα (RBAC/ABAC/όρια).
Δεν Βρέθηκε 404 - κανένας πόρος/τελικό σημείο.
409 Σύγκρουση - βέλτιστο κλείδωμα, ιδεατότητα.
Έφυγε - τελικό σημείο μόνιμα αφαιρεθεί.
Η προϋπόθεση απέτυχε - ETag/If-Match απέτυχε.
415 Μη υποστηριζόμενος τύπος πολυμέσων - Άκυρος 'τύπος περιεχομένου'.
422 Μη αποδοτική οντότητα - επικύρωση των επιχειρηματικών κανόνων.
429 Πάρα πολλές αιτήσεις - υπέρβαση ποσοστώσεων/ταχύτητας (βλέπε § 7).

5xx (σφάλμα εξυπηρετητή)

Σφάλμα εσωτερικού εξυπηρετητή 500 - ξαφνικό σφάλμα; να μην αποκαλύπτονται στοιχεία.
502 Κακή πύλη - Σφάλμα ανάντη.
503 Μη διαθέσιμη υπηρεσία - υποβάθμιση/υπερφόρτωση, δώστε 'Retry-After'.
504 Χρονοδιάγραμμα πύλης - χρονοδιάγραμμα υποστήριξης.

💡 Κατώφλι: 4xx δεν είναι retrayem, 5xx είναι retrayable (backoff/jitter), 429 retraye μετά το 'Retry-After'.

5) Ταξινόμηση τομέα 'error _ code'

Συνιστούμε τις ακόλουθες σειρές:
  • 'AUTH _' - πιστοποίηση/εξουσιοδότηση.
  • «VAL _» - επικύρωση δεδομένων εισόδου.
  • 'RATELIMIT _' - ποσοστώσεις και ταχύτητα.
  • 'IDEMP _' - ταυτότητα/αντίγραφα.
  • 'CONFLICT _' - εκδόσεις/καθεστώς.
  • 'DEP _' - εξαρτήσεις (PSP/DNS/SMTP).
  • «PAY _» - επιχειρηματικά σφάλματα του τομέα πληρωμών.
  • «SEC _» - ασφάλεια (υπογραφές, HMAC, mTLS).
  • «INT _» - εσωτερικό ξαφνικό.
Απαιτήσεις:
  • Σταθερότητα με την πάροδο του χρόνου (back-compat).
  • Περιγραφές και παραδείγματα στον κατάλογο σφαλμάτων (docs + machine-readable JSON).

6) Ανακτήσιμο έναντι μη ανακτήσιμο

Πεδία:
  • «ανακτήσιμο: αληθινό»
  • Αν 'αληθεύει' - απαραίτητα 'Retry-After' (σε δευτερόλεπτα) ή συμβόλαιο 'εκθετική back-off (ξεκινώντας από 1-2 s, μέγιστο 30-60 s) ".

Επαναφορτιζόμενο συνήθως: '502/503/504', περίπου '500', '429' (μετά το παράθυρο).
Μη ανακτήσιμο: '400/401/403/404/ 409/410/415/422'.

7) Όρια ποσοστώσεων και σφάλματα ποσοστώσεων (429)

Σώµα:
json
{
"type": "https://api. example. com/errors/rate_limited",
"title": "Rate limit exceeded",
"status": 429,
"error_code": "RATELIMIT_RPS",
"detail": "Too many requests",
"retriable": true
}
Τίτλοι:
  • 'Retry-After: 12'
  • Οριακό όριο X- , «Όριο X- που απομένει», «Όριο X- »
  • : «X-Ποσόστωση-Όριο», «X-Ποσόστωση-Υπόλοιπο», «X-Ποσόστωση-Επαναφορά»

8) Ιδιαιτερότητα και συγκρούσεις

Σε γραπτές αιτήσεις - 'Idempotency-Key' (μοναδικό εντός 24-72 ωρών).
Retry σύγκρουση → 409 Σύγκρουση με 'error _ code: "IDEMP_REPLAY"'.
Η διαμάχη έκδοσης πόρων για το ETag → 412 απέτυχε.
Στην απάντηση επισυνάψτε ένα 'resource _ i /' status _ url' για μια ασφαλή νέα αίτηση.

9) Επικύρωση και 422

Επαναφορά καταλόγου σφαλμάτων ανά πεδίο:
json
{
"status": 422,
"error_code": "VAL_001",
"errors": [
{"field":"email","code":"email_invalid","message":"Invalid email"},
{"field":"age","code":"min","message":"Must be >= 18"}
]
}
Κανόνες:
  • Μην επαναλαμβάνετε το ίδιο στα 400 - 422 που προτιμώνται για την επικύρωση της επιχείρησης.
  • Τα μηνύματα είναι αναγνώσιμα από τον άνθρωπο. Ο «κώδικας» είναι μηχαναγνώσιμος.

10) Ασφάλεια σφαλμάτων

Ποτέ: στοίβα ίχνη, SQL, μονοπάτια αρχείων, ονόματα ιδιωτικών ξενιστών.
Επεξεργασία του PII. παρακολουθούν το GDPR/DSAR.
Για υπογραφή/HMAC, γίνεται διάκριση μεταξύ 'SEC _ SIGNATURE _ MISMATCH' (403) και 'SEC _ TIMESTAMP _ SKEW' (401/403) με την άμεση «check ± time 5 min».

11) Συσχέτιση και παρατηρησιμότητα

Πάντα προσθήκη 'trace _ id '/' X-Request-ID' και κύλιση μέσω των αρχείων καταγραφής/κομματιών.
Συγκεντρωτικά σφάλματα κατά 'error _ code' and 'status' → ταμπλό «κορυφαία σφάλματα», «νέα εναντίον γνωστών».
Προειδοποιήσεις: 5xx/422/429 ακίδα, p95 καθυστέρηση, μερίδιο σφαλμάτων.

12) gRPC/GraphQL/Webhooks - χαρτογραφήσεις

gRPC ↔ HTTP

gRPCΑξίαHTTP
«OK»επιτυχία200
'ΑΚΥΡΩΤΙΚΟ _ ΕΠΙΧΕΙΡΗΜΑ'επικύρωση422/400
«ΜΗ ΕΞΟΥΣΙΟΔΟΤΗΜΕΝΕΣ»καμία ένδειξη401
'ΑΔΕΙΑ _ DENIED'χωρίς δικαιώματα403
'NOT _ FOUND'κανένας πόρος404
«ΉΔΗ _ ΥΠΑΡΞΕΙΣ»σύγκρουση409
'FAILED _ PRECONTITION'ETag/προϋποθέσεις412
«ΠΌΡΟΣ _ ΕΞΑΝΤΛΗΜΕΝΟΣ»ποσοστώσεις429
«ΜΗ ΔΙΑΘΈΣΙΜΗ»Μη διαθέσιμο503
«ΠΡΟΘΕΣΜΙΑ _ ΥΠΕΡΒΑΣΗΣ»timeout504
«INTERNAL»εσωτερικά500

GraphQL

Μεταφορά 200, αλλά 'σφάλματα []' μέσα - προσθήκη 'extensions. κωδικός "и" trace _ id ".
Για «θανατηφόρα» (επαλήθευση ταυτότητας/ποσοστώσεις) - μια πραγματική 401/403/429 HTTP είναι καλύτερη.

Webhooks

Θεωρήστε επιτυχείς μόνο 2xx παραλήπτες.
Retrai με εκθετική back-off, 'X-Webhook-ID', 'X-Signature'.
410 από τον λήπτη - επανάληψη διακοπής (αφαιρέθηκε το τελικό σημείο).

13) Έκδοση λάθους

'type '/' error _ code' - σταθερό· νέο - μόνο προσθήκη.
Κατά την αλλαγή του σχήματος του σώματος, αυξήστε τη μικρή έκδοση του API ή 'πρόβλημα + json? v = 2 '.
Τεκμηρίωση: πίνακας κωδικών + παραδείγματα. λάθη changelog.

14) Τεκμηρίωση (θραύσματα OpenAPI)

Συνολικές απαντήσεις

yaml components:
responses:
Problem:
description: Problem Details content:
application/problem+json:
schema:
$ref: '#/components/schemas/Problem'
schemas:
Problem:
type: object required: [type, title, status, error_code, trace_id]
properties:
type: { type: string, format: uri }
title: { type: string }
status: { type: integer }
error_code: { type: string }
detail: { type: string }
instance: { type: string }
trace_id: { type: string }
retriable: { type: boolean }
errors:
type: array items:
type: object properties:
field: { type: string }
code: { type: string }
message: { type: string }

Παράδειγμα τελικού σημείου

yaml paths:
/v1/users:
post:
responses:
'201': { description: Created }
'401': { $ref: '#/components/responses/Problem' }
'422': { $ref: '#/components/responses/Problem' }
'429': { $ref: '#/components/responses/Problem' }
'500': { $ref: '#/components/responses/Problem' }

15) Δοκιμές και ποιότητα

Σύμβαση δοκιμής: αντιστοιχία 'application/problem + json', απαιτούμενα πεδία.
Αρνητικές δοκιμές: όλοι οι κλάδοι 401/403/404/ 409/422/429/500.
Χάος/λανθάνουσα κατάσταση: έλεγχος των ρετιρέ για 5xx/ 503/504/429 ('Retry-After').
Δοκιμές ασφαλείας: χωρίς εσωτερικά μηνύματα, σωστή μάσκα PII.
Οπισθοδρόμηση: Οι παλιοί πελάτες κατανοούν νέα πεδία (προσθέστε, μην σπάσετε).

16) Κατάλογος ελέγχου εφαρμογής

  • Ενιαίο 'πρόβλημα + json' + σταθερό 'error _ code'.
  • Διορθώστε τη σημασιολογία HTTP/gRPC/GraphQL.
  • Ανακτήσιμες/μη ανακτήσιμες + «Retry-After »/εφεδρικές συστάσεις.
  • Κεφαλίδες ορίου ταχύτητας και 429 συμπεριφορά.
  • Idempotency ('Idempotency-Key', 409/412).
  • Ασφάλεια: χωρίς ίχνη/μυστικά στοίβας, έκδοση PII.
  • «trace _ id »/« X-Request-ID» σε όλα τα σφάλματα.
  • Τεκμηρίωση καταλόγου σφαλμάτων και παραδείγματα.
  • Παρακολούθηση με ταξινόμηση σφαλμάτων.
  • Αυτοτελείς αναλύσεις αρνητικών σεναρίων.

17) Mini-FAQ

Πώς διαφέρουν 400 από 422

400 - αποτυχημένο αίτημα (τύπος σύνταξης/περιεχομένου). 422 - ισχύει στη σύνταξη, αλλά οι επιχειρηματικοί κανόνες δεν εγκρίθηκαν.

Πότε είναι το 401 και πότε το 403

401 - καμία/εσφαλμένη ένδειξη· 403 - υπάρχει ένα σύμβολο, δεν υπάρχουν αρκετά δικαιώματα.

Χρειάζεται το Retry-After 'always

Για το 429/503, ναι; για τα υπόλοιπα, ανακτήσιμα - είναι σκόπιμο να διατυπωθεί ρητή σύσταση.

Σύνολο

Καλά σχεδιασμένα σφάλματα είναι η σύμβαση: σωστή κατάσταση HTTP, ενιαίο 'πρόβλημα + json', σταθερό 'error _ code', σαφείς υποδείξεις retray, και ισχυρή ασφάλεια. Τυποποιήστε τη μορφή, τεκμηριώστε την ταξινομία, προσθέστε τηλεμετρία και δοκιμές - και το API σας γίνεται προβλέψιμο, ασφαλές και φιλικό προς τον ολοκληρωμένο.

Contact

Επικοινωνήστε μαζί μας

Επικοινωνήστε για οποιαδήποτε βοήθεια ή πληροφορία.Είμαστε πάντα στη διάθεσή σας.

Telegram
@Gamble_GC
Έναρξη ολοκλήρωσης

Το Email είναι υποχρεωτικό. Telegram ή WhatsApp — προαιρετικά.

Το όνομά σας προαιρετικό
Email προαιρετικό
Θέμα προαιρετικό
Μήνυμα προαιρετικό
Telegram προαιρετικό
@
Αν εισαγάγετε Telegram — θα απαντήσουμε και εκεί.
WhatsApp προαιρετικό
Μορφή: κωδικός χώρας + αριθμός (π.χ. +30XXXXXXXXX).

Πατώντας «Αποστολή» συμφωνείτε με την επεξεργασία δεδομένων.