Cum să construiești un REST API: design, securitate și publicare
Pentru a construi un REST API, fă o listă cu resursele pe care le gestionează aplicația ta (utilizatori, comenzi, rezervări), dă fiecăreia un URL, de exemplu /orders și /orders/{id}, și folosește metodele HTTP pentru acțiuni: GET pentru citire, POST pentru creare, PATCH pentru actualizare, DELETE pentru ștergere. Returnează date în JSON cu coduri de stare potrivite, validează fiecare intrare, cere autentificare și verificări de permisiuni pe fiecare înregistrare, pe server, și paginează listele. Apoi documentează endpoint-urile și publică API-ul în spatele HTTPS.
Ghidul acoperă deciziile de design, un set de rute ca exemplu, prompturi pentru un AI app builder și greșelile care duc la găuri de securitate. Dacă API-urile îți sunt noi, începe cu ce este un API.
Când ai nevoie de un REST API
- Frontend-ul tău web trebuie să salveze și să încarce date de pe un server
- O aplicație mobilă, un partener sau un instrument de automatizare are nevoie de acces la datele tale
- Alte servicii îți trimit evenimente (webhook-uri)
- Împarți munca între o echipă de frontend și una de backend
REST este cel mai comun stil, dar nu singurul. REST vs GraphQL explică când un singur endpoint de interogare flexibilă este mai potrivit.
Design întâi: resurse și rute
Scrie substantivele din aplicația ta și ce fac oamenii cu ele. Pentru o aplicație simplă de rezervări:
| Metodă | Rută | Ce face | Cod de succes |
|---|---|---|---|
GET | /api/bookings | Listează rezervările apelantului (paginate) | 200 |
POST | /api/bookings | Creează o rezervare | 201 |
GET | /api/bookings/{id} | Returnează o rezervare | 200 |
PATCH | /api/bookings/{id} | Modifică unele câmpuri | 200 |
DELETE | /api/bookings/{id} | Anulează o rezervare | 204 |
GET | /api/health | Verificare de stare pentru monitorizare | 200 |
Acestea corespund operațiilor create, read, update și delete; vezi ce este CRUD. Convenții care merită urmate:
- Substantive la plural, fără verbe în URL-uri:
/bookings, nu/getBookings. - Imbricare doar pe un nivel atunci când clarifică proprietatea:
/bookings/{id}/notes. - Acțiunile care nu sunt CRUD pot fi sub-resurse:
POST /bookings/{id}/canceleste mai clar decât un PATCH „magic”. - Denumire consecventă a câmpurilor, de exemplu
created_atpeste tot.
Coduri de stare și erori
Folosește codurile HTTP standard, ca clienții să știe ce s-a întâmplat fără să parseze text:
| Cod | Înseamnă | Folosește-l când |
|---|---|---|
| 200 | OK | Citire sau actualizare reușită |
| 201 | Created | Un POST a creat ceva |
| 204 | No Content | Succes fără nimic de returnat |
| 400 | Bad Request | Datele nu au trecut validarea |
| 401 | Unauthorized | Nu ești autentificat sau tokenul nu e valid |
| 403 | Forbidden | Ești autentificat, dar nu ai voie |
| 404 | Not Found | Nu există sau apelantul nu trebuie să știe că există |
| 409 | Conflict | Duplicat sau intervalul este deja rezervat |
| 429 | Too Many Requests | Ai atins limita de cereri |
| 500 | Server Error | Ceva s-a stricat de partea ta |
Returnează erorile într-o structură JSON consecventă, de exemplu {"error": {"code": "slot_taken", "message": "Acest interval nu mai este disponibil."}}, și nu include niciodată urme de stivă (stack traces) sau erori de bază de date în răspunsuri.
Opțiuni și compromisuri
| Decizie | Alegerea simplă | Alternativa |
|---|---|---|
| Unde trăiește API-ul | Rute de API în framework-ul tău web | Un serviciu API separat, util pentru mai mulți clienți sau un alt limbaj |
| Autentificare | Cookie-uri de sesiune pentru aplicația ta web | Tokenuri (bearer tokens sau chei API) pentru aplicații mobile și terți |
| Paginare | ?page=2&limit=20 | Bazată pe cursor (?after=...), mai stabilă pentru liste mari care se schimbă |
| Versionare | Niciuna până ai utilizatori externi | /v1/ în cale odată ce alții depind de el |
| Documentație | Un README cu lista rutelor | O specificație OpenAPI, din care unelte pot genera documentație interactivă și cod client |
Pas cu pas
- Listează resursele și rutele ca mai sus, inclusiv cine are voie să apeleze fiecare.
- Modelează datele în baza ta de date, cu câmpurile și relațiile necesare.
- Construiește întâi rutele de citire, apoi pe cele de creare, actualizare și ștergere.
- Validează datele la fiecare scriere cu o bibliotecă de scheme: câmpuri obligatorii, tipuri, lungimi, valori permise. Respinge câmpurile necunoscute.
- Adaugă autentificare, apoi autorizare pe înregistrare: încărcarea lui
/bookings/42trebuie să verifice că rezervarea 42 aparține apelantului, nu doar că cineva este autentificat. - Paginează fiecare listă și limitează dimensiunea paginii.
- Limitează numărul de cereri pentru autentificare și pentru rutele costisitoare. Vezi limitarea cererilor.
- Configurează CORS doar dacă browsere de pe alte domenii trebuie să apeleze API-ul, și listează explicit originile respective. Cum rezolvi erorile CORS explică erorile pe care le vei vedea.
- Scrie documentație și teste pentru fiecare rută, inclusiv cazurile de eroare.
- Publică cu secretele în variabile de mediu, HTTPS, jurnale și o verificare de stare.
Prompturi pentru AI app builder-ul tău
Schelet:
Creează un REST API pentru rezervări cu aceste rute: GET /api/health, GET /api/bookings (paginat, maximum 50 pe pagină), POST /api/bookings, GET /api/bookings/:id, PATCH /api/bookings/:id, DELETE /api/bookings/:id. Stochează datele în baza noastră de date. Validează corpurile cererilor cu o bibliotecă de scheme și respinge câmpurile necunoscute. Returnează erorile JSON ca {"error": {"code", "message"}} cu coduri de stare corecte (400, 401, 403, 404, 409). Păstrează secretele în variabile de mediu.
Securitate:
Cere autentificare pe fiecare rută de rezervări. La fiecare citire, actualizare și ștergere, verifică pe server că rezervarea aparține utilizatorului curent; returnează 404 dacă nu aparține. Nu accepta niciodată ID-uri de utilizator sau roluri din corpul cererii. Limitează POST /api/bookings la 20 pe minut pentru fiecare utilizator. Înregistrează erorile pe server, fără să returnezi urme de stivă.
Documentație:
Scrie o descriere OpenAPI a acestor rute și un README scurt cu exemple de cereri și răspunsuri pentru fiecare.
Testarea API-ului
Testează din afara frontend-ului, pentru că atacatorii o vor face:
- Fiecare rută funcționează cu date valide și returnează forma și codul documentate
- Câmpurile lipsă sau invalide returnează 400 cu un mesaj clar
- Lipsa tokenului returnează 401 pe fiecare rută protejată
- Utilizatorul A care cere înregistrarea utilizatorului B după ID primește 404 sau 403
- Listele sunt paginate; un
limitfoarte mare este limitat - Creările duplicate sau conflictuale returnează 409, nu 500
- Limitele de cereri returnează 429
- Răspunsurile de eroare nu conțin urme de stivă, SQL sau secrete
- CORS permite doar originile pe care le dorești
Greșeli frecvente
- Verifici autentificarea, dar nu și proprietatea. Cea mai comună gaură din API-uri: orice utilizator autentificat poate citi orice înregistrare schimbând ID-ul.
- Ai încredere în client. Prețurile, rolurile și ID-urile utilizatorilor din corpul cererii pot fi modificate.
- Returnezi rânduri întregi din baza de date. Hash-urile parolelor și câmpurile interne se scurg. Alege ce include fiecare răspuns.
- Liste fără limită. O singură cerere pentru fiecare înregistrare poate încetini întreaga aplicație.
200 OKcu o eroare în interior. Clienții și monitorizarea nu pot spune că a eșuat.- CORS setat să permită orice pe un API care folosește cookie-uri.
- Fără verificare de stare sau jurnale, astfel încât afli despre întreruperi de la utilizatori.
Pentru o verificare mai amplă înainte de lansare, vezi lista de verificare de securitate pentru aplicațiile construite cu AI.
Cum construiești un REST API în Mythex
Poți cere în Mythex un API ca parte a aplicației tale sau ca serviciu separat. Rețeta din documentația REST API backend are un prompt de pornire: numești framework-ul și rutele, ceri erori JSON clare, păstrezi secretele în variabile de mediu și incluzi un Dockerfile. Backend-urile containerizate în Node, Python, C#, Java și altele se publică printr-un Dockerfile, iar Mythex se ocupă de publicare din meniul Publish (backend-uri API). Un proiect poate rula un site web și un server API alături, iar poți comuta între ele în previzualizare. Păstrează cheile ca secrete ale proiectului și, dacă API-ul are nevoie de o bază de date, cere-o în chat. Pentru lucrul programat în jurul API-ului tău, vezi cum rulezi joburi în fundal.
Întrebări
Ce este un REST API?
Un REST API este o modalitate prin care programele lucrează cu datele aplicației tale prin HTTP. Fiecare tip de date este o resursă cu propriul URL, de exemplu /orders, iar metodele standard acționează asupra ei: GET pentru citire, POST pentru creare, PATCH sau PUT pentru actualizare și DELETE pentru ștergere. Datele sunt de obicei trimise în format JSON.
În ce limbaj ar trebui să construiesc un REST API?
Folosește ce poate întreține tu sau echipa ta. Node.js cu Express sau Fastify, Python cu FastAPI, precum și framework-urile C# sau Java funcționează bine. Regulile de design pentru rute, coduri de stare, validare și autentificare contează mai mult decât limbajul.
Cum îmi securizez un REST API?
Cere autentificare pentru fiecare rută care nu este publică, verifică pe server dacă apelantul are acces la fiecare înregistrare în parte, validează toate datele primite, folosește HTTPS, limitează numărul de cereri și păstrează secretele în variabile de mediu. Nu avea încredere niciodată în ID-urile sau rolurile trimise de client.
Am nevoie de un backend separat pentru un REST API?
Nu întotdeauna. Framework-uri precum Next.js pot servi rute de API alături de pagini. Un serviciu API separat are sens când mai mulți clienți (web, mobil, parteneri) îl folosesc sau când are nevoie de propriul limbaj ori de propria scalare.