Правильный rest api
TRANSCRIPT
Правильный REST API
Владислав Алексеев
API?
Стив Джобс производит революцию в индустрии (2007)
Что такое REST?
REST - это набор принципов, которые
определяют веб-стандарты, такие как
HTTP and URIs и как они используются.
Roy Thomas
Fielding
Что такое REST?
RE - Representational
S - State
T - Transfer
Золотое правило REST
Хороший RESTful API тот, который можно менять легко и просто.
Mugunth Kumar
Каждый источник обладает глобальным
идентификатором
Например: https://api.myapp.com/feed
Независимость от состояния (Statelessness)
RESTful сервер не должен отслеживать,
хранить и тем более использовать в работе
текущую контекстную информацию о
клиенте.
Независимость от состояния (Statelessness)
api.myapp.com/feed
Независимость от состояния (Statelessness)
● /feed?last=20150101 - передача GET
параметра
● HTTP Header - If-Modified-Since
Единый интерфейс
HTTP POST GET PUT DELETE
SQL INSERT SELECT UPDATE DELETE
CRUD CREATE READ UPDATE DELETE
Единый интерфейс
GET api.myapp.com/getBook?id=14
ПЛОХО!
GET api.myapp.com/book/14
ХОРОШО
Единый интерфейс
GET api.myapp.com/deleteBook?id=14
2 раза ПЛОХО
DELETE api.myapp.com/book/14
ХОРОШО
Единый интерфейс
Просто и понятно:
GET api.myapp.com/book/ — получить список всех
книг
GET api.myapp.com/book/3 — получить книгу
PUT api.myapp.com/book/ — добавить книгу
POST api.myapp.com/book/3 – изменить книгу
DELETE api.myapp.com/book/3 – удалить книгу
Единый интерфейс
Единый интерфейс
Коды ответов на запросы
GET | 200 - OK
PUT | 201 - Created
GET | 400 - Bad request
GET | 403 - Forbidden
GET | 404 - Not found
GET | 500 - ISE
GET | 502 - Bad gateway
Кэширование
Если ваше приложение тормозит —добавьте кэширование. Если приложение глючит — уберите кэширование. Ну почему кэширование так сложно!
Кэширование
Модель валидности
location ~ \.(jpg|gif|png|ico|jpeg|css|swf)$
{
expires 7d;
}
Кэширование
ETAG
Разделение на версии
Разделение через URL (просто и логично,
больше подходит для глобальных
изменений)
api.myapp.com/v1/feed
api.myapp.com/v2/feed
Разделение на версии
Разделение через модель (сложнее,
подходит для небольших изменений и
введения фич)
Feed myFeedObject = Feed.createFeedObject("1.0");
myFeedObject.populateWithDBObject(FeedDao* feedDaoObject);
Разделение на версии
Вместо UserAgent можно посылать
заголовок Accept:
Accept: application/json
Accept: application/myapp.1.12+json
Что насчет безопасности?
OAuth HTTPS Onion routing
Какие есть альтернативы?
SOAP vs REST
1. В сервисах, которые будут использоваться из
JS.
2. В сервисах, которые будут использоваться из
языков, в которых нет возможности
сгенерировать прокси клиента.
3. Когда существуют очень высокие требования к
производительности.
SOAP vs REST
1. Транзакции
2. Когда взаимодействие происходит между платформами, под которые
существуют инструменты для ускорения разработки с
использованием SOAP. Например, SOAP-сервис на JAVA, который
будет использоваться из .Net и Flex.
Технологии
Ruby - Ruby On Rails, Grape etc
Java - Jersey, Apache CXF etc
Node.JS - Actionhero.js, express.js etc
PHP - Yii, Laravel etc
Спасибо за внимание!