Правильный REST API

Preview:

Citation preview

Правильный 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

Спасибо за внимание!

Recommended