REST API е архитектурен стил за взаимодействие на компоненти в разпределена мрежа, базиран на принципите на Resource-Oriented Architecture и използващ протокол HTTP за пренасяне на данни. Всеки ресурс в REST се идентифицира чрез уникален URL и поддържа набор от стандартни операции чрез HTTP методи: GET, POST, PUT, PATCH, DELETE. Според данните на ProgrammableWeb (2025), над 75% от всички публични уеб-API са изградени на REST архитектура, което го прави стандарт де факто за мобилно и уеб разработване. REST осигурява мащабируемост, независимост на клиента и сървъра и ефективно кеширане, което е особено важно за мобилните приложения с нестабилна мрежова връзка.
Основни поенти
REST API (Representational State Transfer API) е архитектурен стил, предложен от Рой Филдинг в неговата докторска дисертация през 2000 г. Той определя набор от ограничения и принципи за проектиране на мрежови протоколи. API, който отговаря на тези ограничения, се нарича RESTful. REST не е протокол или стандарт това е архитектурен подход, който използва съществуващи протоколи (предимно HTTP) за обмен на данни между клиент и сървър.
Ключовата идея на REST е ресурсно-ориентирана архитектура. Вместо да вика методи на сървъра (като в SOAP или RPC), клиентът работи с ресурси: получава техния списък, създава нови, актуализира или изтрива. Всеки ресурс е единица на предметната област: потребител, поръчка, продукт, статия. Ресурсът има състояние, което се предава на клиента в стандартизиран формат, обикновено JSON. Сървърът не съхранява състоянието на клиента между заявките това е принципът stateless, ключово изискване на REST.
Основни характеристики на REST API:
REST се базира на шест архитектурни ограничения, формулирани от Филдинг. Спазването на тези ограничения гарантира мащабируемост, производителност и лесната интеграция. Всеки принцип решава конкретен проблем на разпределените системи от необходимостта от кеширане до изискванията за сигурност. Нека разгледаме всеки принцип подробно.
| Принцип | Описание | Проблем, който решава |
|---|---|---|
| Client-Server | Разделяне на клиента и сървъра, независима еволюция | Свързаност на компонентите |
| Stateless | Всяка заявка съдържа всички данни за обработване | Мащабиране на сървърите |
| Cacheable | Отговорите са означени като кешируеми или не | Намаляване на мрежовото натоварване |
| Layered System | Междинните слоеве не са видими за клиента | Сигурност и балансиране |
| Uniform Interface | Единен интерфейс: ресурси, методи, статус кодове | Опростяване на архитектурата |
| Code on Demand | Незадължително: пренасяне на изпълним код към клиента | Разширяемост от страна на клиента |
Принципът Uniform Interface допълнително включва четири подограничения: идентификация на ресурсите чрез URI, манипулиране на ресурсите чрез представяния, самоописващи съобщения и HATEOAS (хипермедията като двигател на състоянието на приложението). Последното подограничение често се пренебрегва на практика повечето съвременни REST API не изпълняват HATEOAS напълно, което води до дискусии дали такъв API е "истински" RESTful.
Принципът Stateless един от най-важните за мащабиране. Липсата на сесии на сървъра означава, че всяка инстанция на сървъра може да обработи всяка заявка. Това опростява хоризонталното мащабиране: достатъчно е да добавите нови сървъри зад балансиращия на товара. За мобилните приложения, stateless също така означава, че заявката може да бъде изпратена до всякакъв CDN сървър, което е критично за глобалната достъпност.
Всяка HTTP метода в REST API съответства на определена операция над ресурс: GET за четене, POST за създаване, PUT за пълна актуализация, PATCH за частична актуализация, DELETE за изтриване. Идемпотентността на методите е ключова характеристика: GET, PUT, DELETE са идемпотентни (повторното изпълнение дава същия резултат), POST и PATCH не. Това е важно за обработка на мрежови грешки, когато клиентът не знае дали заявката е стигнала до сървъра.
Статус кодовете HTTP са неотменна част от REST API. Всеки код има определено значение: 200 OK за успешен GET, 201 Created за POST, 204 No Content за DELETE без тяло на отговора, 400 Bad Request при невалидни данни, 401 Unauthorized при липса на удостоверяване, 404 Not Found при липса на ресурс. Правилното използване на статус кодовете прави API-то самодокументиращо се и опростява дебъгването.
JSON (JavaScript Object Notation) основният формат за пренасяне на данни в REST API. Неговата популярност се обяснява с простотата, човешката четивост и вградената поддръжка в JavaScript. JSON се пренася със заглавие Content-Type: application/json. Алтернативите включват XML (обемист, остаряващ), YAML (удобен за конфигурация, по-рядко за API) и Protocol Buffers (бинарен, ефективен за системи с високо натоварване).
Структурата на JSON обект в REST API обикновено включва полетата id, type и атрибутите на ресурса. За колекции се използва JSON масив с метаданни за пагинация. Съвременните REST API следват спецификацията JSON:API (jsonapi.org) или JSON Schema за валидация на отговорите. Използването на единен формат на данни опростява разработването на клиентски библиотеки и генерирането на документация.
Пример на JSON отговор за списък на потребители:
{
"data": [
{
"id": 1,
"name": "Анна Петрова",
"email": "anna@example.com"
}
],
"meta": {
"total": 42,
"page": 1,
"per_page": 10
}
}
Изборът на формата за пренасяне на данни повлиява производителността на мобилното приложение. JSON се комприра чрез GZIP с 70-80%, което го прави приемлив за повечето сценарии. За приложения в реално време с голям обем от данни (стрийминг, игри) се препоръчва преход към бинарни протоколи или използване на WebSocket в комбинация с Protocol Buffers.
Нека разгледаме практически примери за работа с REST API от страната на мобилното приложение. Като пример ще вземем API за работа с поръчки в онлайн магазин. За всяка HTTP метода са показани заявката и очакваният отговор на сървъра. Примерите демонстрират типичната структура на RESTful API, използвана в мобилното разработване.
Заявка за получаване на всички поръчки на потребителя с пагинация. Отговорът съдържа масив от обекти поръчки и метаинформация за навигация по страниците. Параметрите page и per_page се предават чрез query string.
// Retrofit интерфейс за REST API
interface OrderApi {
@GET("api/v1/orders")
suspend fun getOrders(
@Query("page") page: Int = 1,
@Query("per_page") perPage: Int = 20
): Response<OrderListResponse>
}
Създаване на нова поръчка чрез POST заявка. Сървърът връща статус 201 Created и създадения обект в тялото на отговора. Важно: създаването се прави на колекцията /api/v1/orders, а не на конкретен ресурс това е стандартен RESTful модел.
@POST("api/v1/orders")
suspend fun createOrder(
@Body order: CreateOrderRequest
): Response<OrderResponse>
// Пример на тяло на заявка
data class CreateOrderRequest(
val productId: String,
val quantity: Int,
val addressId: String
)
Изтриването на ресурс се изпълнява с метода DELETE на конкретния URL на поръчката. Успешното изтриване връща 204 No Content. Идемпотентността на DELETE означава, че повторната заявка към същия URL ще върне 404 Not Found, което се обработва коректно от клиента.
@DELETE("api/v1/orders/{id}")
suspend fun deleteOrder(
@Path("id") orderId: String
): Response<Unit>
// Използване във ViewModel
fun removeOrder(orderId: String) {
viewModelScope.launch {
val response = api.deleteOrder(orderId)
if (response.isSuccessful) {
showSuccess()
}
}
}
Тези примери демонстрират типичното изпълнение на REST API от страната на Android с използване на Retrofit и Kotlin Coroutines. За iOS приложенията, подобна роля изпълняват URLSession или библиотеката Alamofire в комбинация с Codable протоколите. Структурата на REST API остава същата независимо от платформата променя се само начинът на изпълнение на заявките.
Проектирането на качествен RESTful API изисква спазване на конвенции, които правят API-то интуитивно за разработчиците. Ресурсите трябва да се наричат със съществителни имена в множествено число (/users, /orders, /products), HTTP методите трябва да отразяват операциите, а URL йерархичната структура. Грешките трябва да връщат стандартизиран JSON с код и съобщение, а не просто HTTP статус. Спазването на тези конвенции намалява прага за нови разработчици и опростява интеграцията.
Една от честите грешки при проектиране REST API е прекаленото вложение на ресурси. Вместо /users/1/orders/5/items/3 е по-добре да се използва плоска структура с query параметри: /items?order_id=5&user_id=1. Това опростява кеширането, не изисква поддръжка на дълги пътища на сървъра и е по-лесно за документиране. Плоската архитектура е също така по-съвместима с graph-based заявки при преход към GraphQL в бъдеще.
Сигурността на REST API се осъществява чрез удостоверяване (JWT, OAuth 2.0) и авторизация на ниво ресурс. Всяка заявка трябва да проверява дали потребителят има достъп до изискания ресурс. HTTPS е задължително без криптиране токените и данните се пренасят в открит текст. За мобилните приложения се препоръчва използване на OAuth 2.0 с PKCE (Proof Key for Code Exchange) за сигурно получаване на токени.
Версионирането на REST API е необходимо за обратна съвместимост при промени. Най-разпространените подходи: версия в URL (/api/v1/orders), версия в заглавие (Accept: application/vnd.myapi.v1+json) и версия в query параметър (?api_version=1). URL версионирането е най-популярният метод, тъй като е ясно видим в логовете и документацията. Обаче той нарушава принципа на REST за единствен URL на ресурса.
Кеширането в REST API се осъществява чрез HTTP заглавия Cache-Control, ETag и Last-Modified. GET заявките, означени като кешируеми, могат да се обслужват от кеша на браузъра или проксито без да се обръщат към сървъра. За мобилните приложения кеширането е особено важно намалява разхода на трафик и ускорява показването на предварително заредени данни при лоша връзка. ETag е хеш на съдържанието на отговора: клиентът го изпраща в If-None-Match, а сървърът връща 304 Not Modified, ако данните не са се променили.
Съвременните алтернативи на REST API включват GraphQL (гъвкав избор на данни от клиента) и gRPC (бинарен протокол на HTTP/2 за микроуслуги). REST все пак остава основен стандарт за публични API благодарение на своята простота, универсалност и широката поддръжка от инструменти. Изборът между REST и алтернативите зависи от конкретните изисквания на проекта: сложност на заявките, обем на данните, изисквания за актуализация в реално време.
Често задавани въпроси
REST архитектурен стил, набор от принципи. RESTful API, който следва тези принципи. RESTful API спазва stateless, единен интерфейс, кеширане и клиент-сървър архитектура.
JSON е по-лек от XML (около 30% по-малък), парсира се по-бързо и има вградена поддръжка в JavaScript. XML все още се използва в SOAP и legacy системи, но за мобилни API JSON е стандартът.
Използвайте HTTPS за криптиране, JWT или OAuth 2.0 за удостоверяване. Добавете Rate Limiting, валидация на входните данни, CORS политика и проверка на ролите за всяка заявка.
HATEOAS принцип, при който отговорът на API съдържа връзки към свързани ресурси. Клиентът "навигира" в API чрез тези връзки, а не чрез предварително известни URL. На практика HATEOAS рядко се изпълнява напълно.
Ако имате нужда от гъвкав избор на данни преминете към GraphQL. За висока производителност между микроуслугите gRPC. За актуализации в реално време WebSocket. REST е оптимален за повечето публични API.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също