Πώς να φτιάξετε ένα REST API: σχεδιασμός, ασφάλεια και δημοσίευση
Για να φτιάξετε ένα REST API, καταγράψτε τους πόρους που διαχειρίζεται η εφαρμογή σας (χρήστες, παραγγελίες, κρατήσεις), δώστε σε καθέναν ένα URL όπως /orders και /orders/{id}, και χρησιμοποιήστε μεθόδους HTTP για τις ενέργειες: GET για ανάγνωση, POST για δημιουργία, PATCH για ενημέρωση, DELETE για διαγραφή. Επιστρέψτε JSON με σωστούς κωδικούς κατάστασης, επικυρώστε κάθε είσοδο, απαιτήστε έλεγχο ταυτότητας και ελέγχους δικαιωμάτων ανά εγγραφή στον διακομιστή, και σελιδοποιήστε τις λίστες. Έπειτα τεκμηριώστε τα endpoints και δημοσιεύστε το API πίσω από HTTPS.
Αυτός ο οδηγός καλύπτει τις αποφάσεις σχεδίασης, ένα παράδειγμα συνόλου διαδρομών, prompts για έναν AI app builder και τα λάθη που δημιουργούν κενά ασφαλείας. Αν τα API είναι καινούργια για εσάς, ξεκινήστε με το τι είναι ένα API.
Πότε χρειάζεστε ένα REST API
- Το web frontend σας πρέπει να αποθηκεύει και να φορτώνει δεδομένα από διακομιστή
- Μια εφαρμογή για κινητά, ένας συνεργάτης ή ένα εργαλείο αυτοματισμού χρειάζεται πρόσβαση στα δεδομένα σας
- Άλλες υπηρεσίες σας στέλνουν γεγονότα (webhooks)
- Μοιράζετε τη δουλειά ανάμεσα σε μια ομάδα frontend και μια ομάδα backend
Το REST είναι το πιο συνηθισμένο στυλ, αλλά όχι το μόνο. Το REST vs GraphQL εξηγεί πότε ένα ενιαίο, ευέλικτο endpoint ερωτημάτων ταιριάζει καλύτερα.
Σχεδιάστε πρώτα: πόροι και διαδρομές
Γράψτε τα ουσιαστικά της εφαρμογής σας και τι κάνουν οι χρήστες με αυτά. Για μια απλή εφαρμογή κρατήσεων:
| Μέθοδος | Διαδρομή | Τι κάνει | Κωδικός επιτυχίας |
|---|---|---|---|
GET | /api/bookings | Λίστα των κρατήσεων του καλούντος (σελιδοποιημένη) | 200 |
POST | /api/bookings | Δημιουργία κράτησης | 201 |
GET | /api/bookings/{id} | Ανάγνωση μίας κράτησης | 200 |
PATCH | /api/bookings/{id} | Αλλαγή ορισμένων πεδίων | 200 |
DELETE | /api/bookings/{id} | Ακύρωση κράτησης | 204 |
GET | /api/health | Έλεγχος υγείας για παρακολούθηση | 200 |
Αυτές αντιστοιχούν σε δημιουργία, ανάγνωση, ενημέρωση και διαγραφή· δείτε το τι είναι το CRUD. Συμβάσεις που αξίζει να ακολουθήσετε:
- Ουσιαστικά στον πληθυντικό, χωρίς ρήματα στα URL:
/bookings, όχι/getBookings. - Φωλιάστε μόνο ένα επίπεδο όταν διευκρινίζει την ιδιοκτησία:
/bookings/{id}/notes. - Ενέργειες που δεν είναι CRUD μπορούν να είναι υπο-πόροι: το
POST /bookings/{id}/cancelείναι πιο σαφές από ένα «μαγικό» PATCH. - Συνεπής ονοματολογία για τα πεδία, όπως
created_atπαντού.
Κωδικοί κατάστασης και σφάλματα
Χρησιμοποιήστε τυπικούς κωδικούς HTTP, ώστε οι πελάτες να ξέρουν τι συνέβη χωρίς να αναλύουν κείμενο:
| Κωδικός | Σημασία | Χρησιμοποιήστε όταν |
|---|---|---|
| 200 | OK | Επιτυχής ανάγνωση ή ενημέρωση |
| 201 | Created | Ένα POST δημιούργησε κάτι |
| 204 | No Content | Επιτυχία χωρίς περιεχόμενο για επιστροφή |
| 400 | Bad Request | Η είσοδος απέτυχε στην επικύρωση |
| 401 | Unauthorized | Δεν έχετε συνδεθεί ή το token δεν είναι έγκυρο |
| 403 | Forbidden | Έχετε συνδεθεί, αλλά δεν επιτρέπεται η ενέργεια |
| 404 | Not Found | Δεν υπάρχει, ή ο καλών δεν πρέπει να μάθει ότι υπάρχει |
| 409 | Conflict | Διπλότυπο, ή το slot είναι ήδη κλεισμένο |
| 429 | Too Many Requests | Έγινε υπέρβαση του ορίου αιτημάτων |
| 500 | Server Error | Κάτι χάλασε από την πλευρά σας |
Επιστρέφετε τα σφάλματα σε ένα συνεπές σχήμα JSON, για παράδειγμα {"error": {"code": "slot_taken", "message": "Αυτή η ώρα δεν είναι πλέον διαθέσιμη."}}, και ποτέ μην περιλαμβάνετε stack traces ή σφάλματα βάσης δεδομένων στις απαντήσεις.
Επιλογές και συμβιβασμοί
| Απόφαση | Απλή επιλογή | Εναλλακτική |
|---|---|---|
| Πού βρίσκεται το API | API routes μέσα στο web framework σας | Ξεχωριστή υπηρεσία API, χρήσιμη για πολλούς πελάτες ή άλλη γλώσσα |
| Έλεγχος ταυτότητας | Cookies συνεδρίας για τη δική σας web εφαρμογή | Tokens (bearer tokens ή κλειδιά API) για εφαρμογές κινητών και τρίτους |
| Σελιδοποίηση | ?page=2&limit=20 | Με cursor (?after=...), σταθερότερη για μεγάλες, μεταβαλλόμενες λίστες |
| Εκδόσεις | Καμία, μέχρι να έχετε εξωτερικούς χρήστες | /v1/ στη διαδρομή, όταν άλλοι εξαρτώνται από αυτήν |
| Τεκμηρίωση | Ένα README με τις διαδρομές | Προδιαγραφή OpenAPI, από την οποία εργαλεία φτιάχνουν διαδραστική τεκμηρίωση και κώδικα πελάτη |
Βήμα προς βήμα
- Καταγράψτε τους πόρους και τις διαδρομές όπως παραπάνω, μαζί με το ποιος μπορεί να καλεί καθεμία.
- Μοντελοποιήστε τα δεδομένα στη βάση σας, με τα πεδία και τις σχέσεις που χρειάζεστε.
- Φτιάξτε πρώτα τις διαδρομές ανάγνωσης, και μετά δημιουργία, ενημέρωση και διαγραφή.
- Επικυρώστε την είσοδο σε κάθε εγγραφή με μια βιβλιοθήκη σχήματος: υποχρεωτικά πεδία, τύποι, μήκη, επιτρεπτές τιμές. Απορρίψτε τα άγνωστα πεδία.
- Προσθέστε έλεγχο ταυτότητας, και έπειτα εξουσιοδότηση ανά εγγραφή: η φόρτωση του
/bookings/42πρέπει να ελέγχει ότι η κράτηση 42 ανήκει στον καλούντα, και όχι μόνο ότι κάποιος έχει συνδεθεί. - Σελιδοποιήστε κάθε λίστα και ορίστε ανώτατο μέγεθος σελίδας.
- Περιορίστε τον ρυθμό στη σύνδεση και στις ακριβές διαδρομές. Δείτε το όριο ρυθμού αιτημάτων.
- Ρυθμίστε το CORS μόνο αν προγράμματα περιήγησης σε άλλους τομείς πρέπει να καλούν το API, και καταγράψτε ρητά αυτές τις προελεύσεις. Το πώς να διορθώσετε σφάλματα CORS εξηγεί τα σφάλματα που θα δείτε.
- Γράψτε τεκμηρίωση και δοκιμές για κάθε διαδρομή, συμπεριλαμβανομένων των περιπτώσεων αποτυχίας.
- Δημοσιεύστε με τα μυστικά σε μεταβλητές περιβάλλοντος, HTTPS, καταγραφές και έλεγχο υγείας.
Prompts για τον AI builder σας
Σκελετός:
Φτιάξε ένα REST API για κρατήσεις με αυτές τις διαδρομές: GET /api/health, GET /api/bookings (σελιδοποιημένο, έως 50 ανά σελίδα), POST /api/bookings, GET /api/bookings/:id, PATCH /api/bookings/:id, DELETE /api/bookings/:id. Αποθήκευσε τα δεδομένα στη βάση μας. Επικύρωσε τα σώματα των αιτημάτων με μια βιβλιοθήκη σχήματος και απέρριψε άγνωστα πεδία. Επίστρεψε σφάλματα JSON της μορφής {"error": {"code", "message"}} με σωστούς κωδικούς κατάστασης (400, 401, 403, 404, 409). Κράτα τα μυστικά σε μεταβλητές περιβάλλοντος.
Ασφάλεια:
Απαίτησε σύνδεση σε κάθε διαδρομή bookings. Σε κάθε ανάγνωση, ενημέρωση και διαγραφή, έλεγξε στον διακομιστή ότι η κράτηση ανήκει στον τρέχοντα χρήστη· επίστρεψε 404 αν δεν ανήκει. Μην δέχεσαι ποτέ IDs χρηστών ή ρόλους από το σώμα του αιτήματος. Περιόρισε το POST /api/bookings σε 20 ανά λεπτό ανά χρήστη. Κατέγραφε τα σφάλματα στον διακομιστή χωρίς να επιστρέφεις stack traces.
Τεκμηρίωση:
Γράψε μια περιγραφή OpenAPI για αυτές τις διαδρομές, και ένα σύντομο README με παραδείγματα αιτημάτων και απαντήσεων για κάθε μία.
Δοκιμή του API σας
Δοκιμάστε το από έξω από το frontend, γιατί το ίδιο θα κάνουν και οι επιτιθέμενοι:
- Κάθε διαδρομή λειτουργεί με έγκυρη είσοδο και επιστρέφει την τεκμηριωμένη δομή και κωδικό
- Τα λείποντα ή άκυρα πεδία επιστρέφουν 400 με ένα σαφές μήνυμα
- Χωρίς token, κάθε προστατευμένη διαδρομή επιστρέφει 401
- Ο χρήστης Α που ζητά την εγγραφή του χρήστη Β με ID παίρνει 404 ή 403
- Οι λίστες είναι σελιδοποιημένες, και ένα τεράστιο
limitπεριορίζεται - Οι διπλές ή συγκρουόμενες δημιουργίες επιστρέφουν 409, όχι 500
- Τα όρια ρυθμού επιστρέφουν 429
- Οι απαντήσεις σφάλματος δεν περιέχουν stack traces, SQL ή μυστικά
- Το CORS επιτρέπει μόνο τις προελεύσεις που θέλετε
Συχνά λάθη
- Έλεγχος σύνδεσης χωρίς έλεγχο ιδιοκτησίας. Η πιο συνηθισμένη τρύπα σε API: οποιοσδήποτε συνδεδεμένος χρήστης μπορεί να διαβάσει οποιαδήποτε εγγραφή αλλάζοντας το ID.
- Εμπιστοσύνη στον πελάτη. Τιμές, ρόλοι και IDs χρηστών από το σώμα του αιτήματος μπορούν να αλλάξουν.
- Επιστροφή ολόκληρων γραμμών βάσης. Τα hash κωδικών και τα εσωτερικά πεδία διαρρέουν. Επιλέξτε τι περιλαμβάνει κάθε απάντηση.
- Λίστες χωρίς όριο. Ένα αίτημα για κάθε εγγραφή μπορεί να επιβραδύνει ολόκληρη την εφαρμογή.
200 OKμε μήνυμα σφάλματος μέσα. Οι πελάτες και η παρακολούθηση δεν μπορούν να καταλάβουν ότι απέτυχε.- CORS ρυθμισμένο να επιτρέπει τα πάντα σε API που χρησιμοποιεί cookies.
- Χωρίς έλεγχο υγείας ή καταγραφές, οπότε μαθαίνετε για διακοπές από τους χρήστες.
Για έναν ευρύτερο έλεγχο πριν από την κυκλοφορία, δείτε τη λίστα ελέγχου ασφαλείας για εφαρμογές που φτιάχνονται με AI.
Χτίζοντας ένα REST API στο Mythex
Μπορείτε να ζητήσετε από το Mythex ένα API ως μέρος της εφαρμογής σας ή ως δική του υπηρεσία. Ο οδηγός REST API backend της τεκμηρίωσης έχει ένα αρχικό prompt: ονομάστε το framework και τις διαδρομές σας, ζητήστε σαφή σφάλματα JSON, κρατήστε τα μυστικά σε μεταβλητές περιβάλλοντος και συμπεριλάβετε ένα Dockerfile. Τα container backends σε Node, Python, C#, Java και άλλες γλώσσες δημοσιεύονται μέσω Dockerfile, και το Mythex αναλαμβάνει το deploy από το Publish (API backends). Ένα έργο μπορεί να τρέχει έναν ιστότοπο και έναν διακομιστή API μαζί, και μπορείτε να μεταβαίνετε ανάμεσά τους στην προεπισκόπηση. Αποθηκεύστε τα κλειδιά ως μυστικά του έργου, και αν το API χρειάζεται βάση δεδομένων, ζητήστε την στο chat. Για προγραμματισμένες εργασίες γύρω από το API σας, δείτε πώς να τρέχετε εργασίες παρασκηνίου.
Ερωτήσεις
Τι είναι ένα REST API;
Ένα REST API είναι ένας τρόπος για να δουλεύουν τα προγράμματα με τα δεδομένα της εφαρμογής σας μέσω HTTP. Κάθε είδος δεδομένων είναι ένας πόρος με το δικό του URL, όπως το /orders, και οι τυπικές μέθοδοι ενεργούν πάνω του: GET για ανάγνωση, POST για δημιουργία, PATCH ή PUT για ενημέρωση και DELETE για διαγραφή. Τα δεδομένα συνήθως στέλνονται ως JSON.
Σε ποια γλώσσα να φτιάξω ένα REST API;
Χρησιμοποιήστε αυτό που μπορείτε εσείς ή η ομάδα σας να συντηρείτε. Το Node.js με Express ή Fastify, η Python με FastAPI, και τα frameworks της C# ή της Java λειτουργούν όλα καλά. Οι κανόνες σχεδίασης για διαδρομές, κωδικούς κατάστασης, επικύρωση και έλεγχο ταυτότητας έχουν μεγαλύτερη σημασία από τη γλώσσα.
Πώς ασφαλίζω ένα REST API;
Απαιτήστε έλεγχο ταυτότητας σε κάθε μη δημόσια διαδρομή, ελέγξτε στον διακομιστή ότι ο καλών επιτρέπεται να έχει πρόσβαση σε κάθε συγκεκριμένη εγγραφή, επικυρώστε όλη την είσοδο, χρησιμοποιήστε HTTPS, περιορίστε τον ρυθμό των αιτημάτων και κρατήστε τα μυστικά σε μεταβλητές περιβάλλοντος. Ποτέ μην εμπιστεύεστε IDs ή ρόλους που στέλνει ο πελάτης.
Χρειάζομαι ξεχωριστό backend για ένα REST API;
Όχι πάντα. Frameworks όπως το Next.js μπορούν να σερβίρουν API routes μαζί με τις σελίδες. Μια ξεχωριστή υπηρεσία API έχει νόημα όταν τη χρησιμοποιούν πολλοί πελάτες (web, κινητά, συνεργάτες) ή όταν χρειάζεται τη δική της γλώσσα ή κλιμάκωση.