REST
Категория: Разработка
Какво е REST?
REST (Representational State Transfer) е архитектурен стил за проектиране на distributed systems, специално уеб услуги. REST не е протокол или стандарт, а набор от архитектурни ограничения, които гарантират мащабируемост, надеждност и производителност.
Създаден от Roy Fielding в неговата докторска дисертация през 2000 г., REST се превърна в доминиращия подход за проектиране на уеб APIs.
Основни принципи на REST:
- 1
Client-Server Architecture
Разделяне на клиентския интерфейс от сървърното хранилище на данни. Това позволява независимо развитие и подобрява портативността.
- 2
Stateless
Всяка заявка от клиента към сървъра трябва да съдържа цялата информация, необходима за разбиране и обработка на заявката. Сървърът не запазва състояние между заявките.
- 3
Cacheable
Отговорите трябва да бъдат неявно или изрично дефинирани като кешируеми или некешируеми. Това подобрява производителността.
- 4
Uniform Interface
Унифициран интерфейс между компонентите, който опростява архитектурата и отделя реализациите.
- 5
Layered System
Клиентът не може да предположи дали е свързан директно към крайния сървър или към междинен слой.
- 6
Code on Demand (optional)
Сървърът може временно да разшири функционалността на клиента чрез предаване на изпълним код.
Ключови концепции в REST:
Resources (Ресурси)
Всяко имеваемо нещо е ресурс - потребител, продукт, поръчка. Ресурсите се идентифицират с URI.
/api/users/123Representations (Репрезентации)
Различни формати на ресурса - JSON, XML, HTML. Клиентът и сървърът договарят формата чрез Content-Type.
Content-Type: application/jsonUniform Interface (Унифициран интерфейс)
Стандартизирани HTTP методи и response codes за всички операции.
HTTP Методи в REST:
GET
Извличане на ресурс или колекция от ресурси
- Safe - не променя състоянието
- Idempotent - многократно изпълнение дава същия резултат
- Кешируем
GET /api/usersPOST
Създаване на нов ресурс
- Не-safe - променя състоянието
- Не-idempotent - създава различен ресурс при всяко изпълнение
- Обикновено не се кешира
POST /api/usersPUT
Пълно обновяване на ресурс
- Не-safe - променя състоянието
- Idempotent - многократно изпълнение дава същия резултат
- Обикновено не се кешира
PUT /api/users/123PATCH
Частично обновяване на ресурс
- Не-safe - променя състоянието
- Idempotent - при правилна имплементация
- Обикновено не се кешира
PATCH /api/users/123DELETE
Изтриване на ресурс
- Не-safe - променя състоянието
- Idempotent - след първото изтриване, ресурсът вече не съществува
- Обикновено не се кешира
DELETE /api/users/123HTTP Status Codes в REST:
2xx - Успех
- 200 OK - Успешна заявка
- 201 Created - Ресурсът е създаден
- 204 No Content - Успешна заявка, няма съдържание за връщане
3xx - Пренасочване
- 301 Moved Permanently - Постоянно пренасочване
- 304 Not Modified - Ресурсът не е променян (за кеширане)
4xx - Грешка на клиента
- 400 Bad Request - Невалидна заявка
- 401 Unauthorized - Неоторизиран достъп
- 403 Forbidden - Забранен достъп
- 404 Not Found - Ресурсът не е намерен
- 409 Conflict - Конфликт при обработка
5xx - Грешка на сървъра
- 500 Internal Server Error - Вътрешна сървърна грешка
- 503 Service Unavailable - Услугата не е налична
Добри практики при проектиране на REST APIs:
URI Design
- Използвайте существителни, не глаголи - /users, не /getUsers
- Иерархична структура - /users/123/posts
- Лowercase букви - /api/users
- Хифен вместо долна черта - /user-profiles
- Версиониране - /api/v1/users
Response Format
- JSON като основен формат
- Стандартна структура на отговорите
- Пагинация за големи колекции
- Сортиране и филтриране
- Error handling със стандартни формати
Security
- HTTPS винаги
- Authentication & Authorization
- Rate limiting
- Input validation
- CORS конфигурация
Примери за REST API Design:
Users API
GET /api/v1/users- Вземи всички потребителиPOST /api/v1/users- Създай нов потребителGET /api/v1/users/123- Вземи конкретен потребителPUT /api/v1/users/123- Обнови целия потребителPATCH /api/v1/users/123- Частично обновяванеDELETE /api/v1/users/123- Изтрий потребител
Nested Resources
GET /api/v1/users/123/posts- Вземи постовете на потребителPOST /api/v1/users/123/posts- Създай нов пост за потребителGET /api/v1/users/123/posts/456- Вземи конкретен пост
REST срещу алтернативи:
REST
- HTTP-based
- Stateless
- Кешируем
- Добър за CRUD операции
- Лесно разбираем
GraphQL
- Single endpoint
- Client-defined queries
- No over-fetching
- Добър за complex queries
- По-сложна имплементация
gRPC
- Protocol Buffers
- Висока производителност
- Бинарни данни
- Добър за microservices
- По-сложен за web clients
Добри практики за REST APIs:
- Използвайте правилните HTTP методи - GET, POST, PUT, DELETE, PATCH
- Връщайте подходящи HTTP status codes
- Версионирайте вашия API - /api/v1, /api/v2
- Използвайте пагинация за големи datasets
- Осигурете добро error handling
- Документирайте вашия API - OpenAPI/Swagger
- Имплементирайте rate limiting
- Използвайте HTTPS винаги
- Поддържайте обратна съвместимост
Инструменти и екосистема:
API Documentation
- OpenAPI/Swagger - Стандарт за API документация
- Postman - API development и тестване
- API Blueprint - Документационен формат
Development Frameworks
- Express.js - За Node.js
- Django REST Framework - За Python
- Spring Boot - За Java
- ASP.NET Core - За .NET
- Ruby on Rails - За Ruby
Security
- JWT - JSON Web Tokens за authentication
- OAuth 2.0 - Authorization framework
- CORS - Cross-Origin Resource Sharing