Разработка restful api with all bells and whistles

71
1

Upload: yandex

Post on 02-Jul-2015

4.459 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Разработка RESTful api with all bells and whistles

1

Page 2: Разработка RESTful api with all bells and whistles

2

Разработка RESTful API

with all the bells and

whistles

Роман Акинфеев

Page 3: Разработка RESTful api with all bells and whistles

3

Яндекс.Диск — это сервис, который позволяет

хранить файлы и обмениваться ими, а также

предоставляет доступ к файлам с любого

устройства, подключённого к интернету.

• 20+ млн. зарегистрированных пользователей

• 10+ млн. загружаемых в сутки файлов

• 7+ млрд. файлов

Page 4: Разработка RESTful api with all bells and whistles

4

Яндекс.Диск — это сервис, который позволяет

хранить файлы и обмениваться ими, а также

предоставляет доступ к файлам с любого

устройства, подключённого к интернету.

• 20+ млн. зарегистрированных пользователей

10+ млн. загружаемых в сутки файлов

7+ млрд. файлов

Page 5: Разработка RESTful api with all bells and whistles

5

Яндекс.Диск — это сервис, который позволяет

хранить файлы и обмениваться ими, а также

предоставляет доступ к файлам с любого

устройства, подключённого к интернету.

• 20+ млн. зарегистрированных пользователей

• 10+ млн. загружаемых в сутки файлов

7+ млрд. файлов

Page 6: Разработка RESTful api with all bells and whistles

6

Яндекс.Диск — это сервис, который позволяет

хранить файлы и обмениваться ими, а также

предоставляет доступ к файлам с любого

устройства, подключённого к интернету.

• 20+ млн. зарегистрированных пользователей

• 10+ млн. загружаемых в сутки файлов

• 7+ млрд. файлов

Page 7: Разработка RESTful api with all bells and whistles

7

Yandex Disk APIs

WebDAV

Для работы с Диском, как с файловой системой

RESTful API

Для работы с Диском там, где WebDAV’а мало

Page 8: Разработка RESTful api with all bells and whistles

8

Yandex Disk APIs

WebDAV

Для работы с Диском, как с файловой системой

RESTful API

Для работы с Диском там, где WebDAV’а мало

Page 9: Разработка RESTful api with all bells and whistles

9

Задачи

Page 10: Разработка RESTful api with all bells and whistles

10

Задачи

• Простота изучения возможностей API

Легко расширяемая функциональность

Простота разработки под API

Page 11: Разработка RESTful api with all bells and whistles

11

Задачи

• Простота изучения возможностей API

• Легко расширяемая функциональность

Простота разработки под API

Page 12: Разработка RESTful api with all bells and whistles

12

Задачи

• Простота изучения возможностей API

• Легко расширяемая функциональность

• Простота разработки под API

Page 13: Разработка RESTful api with all bells and whistles

13

RESTful API Яндекс Диска

• Понятная и логичная структура

Hypermedia API

Self-descriptive & Machine-readable API

Page 14: Разработка RESTful api with all bells and whistles

14

RESTful API Яндекс Диска

• Понятная и логичная структура

• Hypermedia API

Self-descriptive & Machine-readable API

Page 15: Разработка RESTful api with all bells and whistles

15

RESTful API Яндекс Диска

• Понятная и логичная структура

• Hypermedia API

• Self-descriptive & Machine-readable API

Page 16: Разработка RESTful api with all bells and whistles

16

Что такое REST?

• Просто набор принципов

• Никаких готовых решений

• Только ограничения

Page 17: Разработка RESTful api with all bells and whistles

17

Клиент-сервер и интерфейс

• Клиент и сервер знают

интерфейс

• Клиент и сервер не знают

друг друга

Профит

Много клиентов хороших и

разных

Сервер не замечает, как

обновляются клиенты

Клиенты не замечают, как

обновляется сервер

Page 18: Разработка RESTful api with all bells and whistles

18

Клиент-сервер и интерфейс

• Клиент и сервер знают

интерфейс

• Клиент и сервер не знают

друг друга

Профит

• Много клиентов хороших и

разных

• Сервер не замечает, как

обновляются клиенты

• Клиенты не замечают, как

обновляется сервер

Page 19: Разработка RESTful api with all bells and whistles

19

Stateless

• Сервер не хранит никакой информации о состоянии

клиента между запросами

Нет соединений

Нет сессий

Нет истории операций клиента

Профит

Бэкэнд легко масштабируется

Клиент не беспокоится ни о чём между запросами

Page 20: Разработка RESTful api with all bells and whistles

20

Stateless

• Сервер не хранит никакой информации о состоянии

клиента между запросами

• Нет соединений

• Нет сессий

• Нет истории операций клиента

Профит

Бэкэнд легко масштабируется

Клиент не беспокоится ни о чём между запросами

Page 21: Разработка RESTful api with all bells and whistles

21

Stateless

• Сервер не хранит никакой информации о состоянии

клиента между запросами

• Нет соединений

• Нет сессий

• Нет истории операций клиента

Профит

• Бэкэнд легко масштабируется

• Клиент не беспокоится ни о чём между запросами

Page 22: Разработка RESTful api with all bells and whistles

22

Кэшируемость и многослойность

• Сервер сообщает, что и как кэшировать

• Клиент может не соединяться напрямую с сервером

Профит

Возможность снизить нагрузку на бэкэнд

Возможность работать с кэшем на клиенте

Page 23: Разработка RESTful api with all bells and whistles

23

Кэшируемость и многослойность

• Сервер сообщает, что и как кэшировать

• Клиент может не соединяться напрямую с сервером

Профит

• Возможность снизить нагрузку на бэкэнд

• Возможность работать с кэшем на клиенте

Page 24: Разработка RESTful api with all bells and whistles

24

Рецепт

RESTful API Яндекс Диска

Page 25: Разработка RESTful api with all bells and whistles

25

Ресурсы

Page 26: Разработка RESTful api with all bells and whistles

26

Ресурсы

• Система оперирует ресурсами

Ресурсы имеют чёткую структуру

URL – уникальный идентификатор ресурса

Ресурсы API Диска:

Файлы и папки – resources

Асинхронные операции – operations

Page 27: Разработка RESTful api with all bells and whistles

27

Ресурсы

• Система оперирует ресурсами

• Ресурсы имеют чёткую структуру

URL – уникальный идентификатор ресурса

Ресурсы API Диска:

Файлы и папки – resources

Асинхронные операции – operations

Page 28: Разработка RESTful api with all bells and whistles

28

Ресурсы

• Система оперирует ресурсами

• Ресурсы имеют чёткую структуру

• URL – уникальный идентификатор ресурса

Ресурсы API Диска:

Файлы и папки – resources

Асинхронные операции – operations

Page 29: Разработка RESTful api with all bells and whistles

29

Ресурсы

• Система оперирует ресурсами

• Ресурсы имеют чёткую структуру

• URL – уникальный идентификатор ресурса

Ресурсы API Диска:

• Файлы и папки – resources

• Асинхронные операции – operations

Page 30: Разработка RESTful api with all bells and whistles

30

URL ресурсов

Page 31: Разработка RESTful api with all bells and whistles

31

URL ресурсов

URL группируются в нэймспэйсы

/disk

URL коллекции ресурсов всегда во множественном числе

/disk / resources

/disk / operations

URL коллекции + идентификатор = URL ресурса

/disk / resources ? path={path}

/disk / operations ? id={id}

/pets / kittens / {name}

Page 32: Разработка RESTful api with all bells and whistles

32

URL ресурсов

URL группируются в нэймспэйсы

/disk

URL коллекции ресурсов всегда во множественном числе

/disk / resources

/disk / operations

URL коллекции + идентификатор = URL ресурса

/disk / resources ? path={path}

/disk / operations ? id={id}

/pets / kittens / {name}

Page 33: Разработка RESTful api with all bells and whistles

33

URL ресурсов

URL группируются в нэймспэйсы

/disk

URL коллекции ресурсов всегда во множественном числе

/disk / resources

/disk / operations

URL коллекции + идентификатор = URL ресурса

/disk / resources ? path={path}

/disk / operations ? id={id}

/pets / kittens / {name}

Page 34: Разработка RESTful api with all bells and whistles

34

URL ресурсов

URL группируются в нэймспэйсы

/disk

URL коллекции ресурсов всегда во множественном числе

/disk / resources

/disk / operations

URL коллекции + идентификатор = URL ресурса

/disk / resources ? path={path}

/disk / operations ? id={id}

/pets / kittens / {name}

Page 35: Разработка RESTful api with all bells and whistles

35

HTTP-методы

Основные CRUD-операции:

GET, POST, PUT, DELETE

Page 36: Разработка RESTful api with all bells and whistles

36

HTTP-методы

GET – безопасный. Делаем запрос, не задумываясь:

GET /disk/resources?path={path}

GET /disk/operations?id={id}

GET, PUT, DELETE – идемпотентные. Повторяем при обрыве,

не задумываясь:

PUT /disk/resources?path={path}

DELETE /disk/resources?path={path}

POST – опасный. Изменяет состояние ресурса, повторять

опасно

OPTIONS – подскажет поддерживаемые ресурсом методы

Page 37: Разработка RESTful api with all bells and whistles

37

HTTP-методы

GET – безопасный. Делаем запрос, не задумываясь:

GET /disk/resources?path={path}

GET /disk/operations?id={id}

GET, PUT, DELETE – идемпотентные. Повторяем при обрыве,

не задумываясь:

PUT /disk/resources?path={path}

DELETE /disk/resources?path={path}

POST – опасный. Изменяет состояние ресурса, повторять

опасно

OPTIONS – подскажет поддерживаемые ресурсом методы

Page 38: Разработка RESTful api with all bells and whistles

38

HTTP-методы

GET – безопасный. Делаем запрос, не задумываясь:

GET /disk/resources?path={path}

GET /disk/operations?id={id}

GET, PUT, DELETE – идемпотентные. Повторяем при обрыве,

не задумываясь:

PUT /disk/resources?path={path}

DELETE /disk/resources?path={path}

POST – опасный. Изменяет состояние ресурса, повторять

опасно

OPTIONS – подскажет поддерживаемые ресурсом методы

Page 39: Разработка RESTful api with all bells and whistles

39

HTTP-методы

GET – безопасный. Делаем запрос, не задумываясь:

GET /disk/resources?path={path}

GET /disk/operations?id={id}

GET, PUT, DELETE – идемпотентные. Повторяем при обрыве,

не задумываясь:

PUT /disk/resources?path={path}

DELETE /disk/resources?path={path}

POST – опасный. Изменяет состояние ресурса, повторять

опасно

OPTIONS – подскажет поддерживаемые ресурсом методы

Page 40: Разработка RESTful api with all bells and whistles

40

Когда CRUD мало

Page 41: Разработка RESTful api with all bells and whistles

41

Когда CRUD мало

Копирование и Перемещение

• Не идемпотентны

• Не безопасны

Надо использовать POST, но метод один, а операции две

На помощь приходят они! Ad Hoc-методы! POST /disk/resources/ copy ? path={path}&from={from}

POST /disk/resources/ move ? path={path}&from={from}

Page 42: Разработка RESTful api with all bells and whistles

42

Когда CRUD мало

Копирование и Перемещение

• Не идемпотентны

• Не безопасны

Надо использовать POST, но метод один, а операции две

На помощь приходят они! Ad Hoc-методы! POST /disk/resources/ copy ? path={path}&from={from}

POST /disk/resources/ move ? path={path}&from={from}

Page 43: Разработка RESTful api with all bells and whistles

43

Когда CRUD мало

Копирование и Перемещение

• Не идемпотентны

• Не безопасны

Надо использовать POST, но метод один, а операции две

На помощь приходят они! Ad Hoc-методы! POST /disk/resources/ copy ? path={path}&from={from}

POST /disk/resources/ move ? path={path}&from={from}

Page 44: Разработка RESTful api with all bells and whistles

44

The Bells And Whistles

RESTful API Яндекс Диска

Page 45: Разработка RESTful api with all bells and whistles

45

Hypermedia API

Предоставлять данные о том, что можно делать с каждым ресурсом.

Hypermedia as the Engine of Application State

Клиент должен взаимодействовать с сервером посредством

hypermedia-контролов, получаемых от сервера.

Профит

Клиент не дёргает захардкоденные URL

Клиент переходит по ссылкам

Page 46: Разработка RESTful api with all bells and whistles

46

Hypermedia API

Предоставлять данные о том, что можно делать с каждым ресурсом.

Hypermedia as the Engine of Application State

Клиент должен взаимодействовать с сервером посредством

hypermedia-контролов, получаемых от сервера.

Профит

Клиент не дёргает захардкоденные URL

Клиент переходит по ссылкам

Page 47: Разработка RESTful api with all bells and whistles

47

Hypermedia API

Предоставлять данные о том, что можно делать с каждым ресурсом.

Hypermedia as the Engine of Application State

Клиент должен взаимодействовать с сервером посредством

hypermedia-контролов, получаемых от сервера.

Профит

• Клиент не дёргает захардкоденные URL

• Клиент переходит по ссылкам

Page 48: Разработка RESTful api with all bells and whistles

48

Hypermedia API

• Collection+JSON

• HAL

• DocJSON

• JSON API

• JSON Hyperschema

Page 49: Разработка RESTful api with all bells and whistles

49

Hypertext Application Language

• Чрезвычайно прост

• Есть draft RFC-стандарта

• Уже встречается в публичных API

• MIME-type: application/hal+json

Благодаря HAL

Клиент знает, что и как может сделать с объектом

Сервер может управлять набором доступных действий

Page 50: Разработка RESTful api with all bells and whistles

50

Hypertext Application Language

• Чрезвычайно прост

• Есть draft RFC-стандарта

• Уже встречается в публичных API

• MIME-type: application/hal+json

Благодаря HAL

• Клиент знает, что и как может сделать с объектом

• Сервер может управлять набором доступных действий

Page 51: Разработка RESTful api with all bells and whistles

51

Обычное API

# пусть у нас есть объект папки

print folder

{

“name”: “foo”,

“path”: “disk:/foo”,

“type”: “dir”

}

# удаляем папку

URL = 'https://cloud-api.yandex.net/v1/disk/resources'

query = {}

query['path'] = folder['path']

query['permanently'] = True

qs = urlencode(query)

url = URL + '?' + qs

request('DELETE', url)

<Response [204]>

Page 52: Разработка RESTful api with all bells and whistles

52

Hypermedia API

# пусть у нас есть объект папки с HAL-ссылками

print folder {

"_links": {

"delete": {

"href": "https://cloud-

api.yandex.net/v1/disk/resources?path=disk%3A%2Ffoo&permanently=True",

"method": "DELETE"

},

},

“name”: “foo”,

“path”: “disk:/foo”,

“type”: “dir”

}

# удаляем папку

action = folder[‘_links’][‘delete’]

request(action[‘method’], action[‘href’])

<Response [204]>

Page 53: Разработка RESTful api with all bells and whistles

53

Self-describing & Machine-readable

Машиночитаемые способы описания REST API

• RAML

• WADL

• JSON Schema + JSON HyperSchema

• Swagger

• IO Docs

• Apiary Blueprints

Page 54: Разработка RESTful api with all bells and whistles

54

Swagger

• Описывает API в виде JSON

• Развивается как стандарт

• Прост для понимания

• Имеет экосистему инструментов

Page 55: Разработка RESTful api with all bells and whistles

55

Swagger описывает

• Структуру API

• Параметры операций над ресурсами

• Структуру возвращаемых объектов

Page 56: Разработка RESTful api with all bells and whistles

56

Профит от Swagger

• Универсальные Swagger-клиенты

• Автогенерация частей нативных SDK

• Готовый open source UI для API

Page 57: Разработка RESTful api with all bells and whistles

57

tech.yandex.ru/disk/poligon

Page 58: Разработка RESTful api with all bells and whistles

58

Что в итоге получилось

Page 59: Разработка RESTful api with all bells and whistles

59

Что в итоге получилось

• Понятная и расширяемая структура

Удобная навигация по API с помощью ссылок

Самодокументируемость и машиночитаемость

Page 60: Разработка RESTful api with all bells and whistles

60

Что в итоге получилось

• Понятная и расширяемая структура

• Удобная навигация по API с помощью ссылок

Самодокументируемость и машиночитаемость

Page 61: Разработка RESTful api with all bells and whistles

61

Что в итоге получилось

• Понятная и расширяемая структура

• Удобная навигация по API с помощью ссылок

• Самодокументируемость и машиночитаемость

Page 62: Разработка RESTful api with all bells and whistles

62

Рецепт правильного REST API

Page 63: Разработка RESTful api with all bells and whistles

63

Рецепт правильного REST API

• Структура в виде ресурсов и операций над ними

Доступ к объектам через коллекции

Старайтесь придерживаться RFC 2616

Используйте Ad Hoc-методы там где не хватает HTTP

Добавляйте в API hypermedia-контролы

HAL – http://stateless.co/hal_specification.html

Описывайте API с помощью машиночитаемых форматов

Swagger – https://helloreverb.com/developers/swagger

Page 64: Разработка RESTful api with all bells and whistles

64

Рецепт правильного REST API

• Структура в виде ресурсов и операций над ними

• Доступ к объектам через коллекции

Старайтесь придерживаться RFC 2616

Используйте Ad Hoc-методы там где не хватает HTTP

Добавляйте в API hypermedia-контролы

HAL – http://stateless.co/hal_specification.html

Описывайте API с помощью машиночитаемых форматов

Swagger – https://helloreverb.com/developers/swagger

Page 65: Разработка RESTful api with all bells and whistles

65

Рецепт правильного REST API

• Структура в виде ресурсов и операций над ними

• Доступ к объектам через коллекции

• Старайтесь придерживаться RFC 2616

Используйте Ad Hoc-методы там где не хватает HTTP

Добавляйте в API hypermedia-контролы

HAL – http://stateless.co/hal_specification.html

Описывайте API с помощью машиночитаемых форматов

Swagger – https://helloreverb.com/developers/swagger

Page 66: Разработка RESTful api with all bells and whistles

66

Рецепт правильного REST API

• Структура в виде ресурсов и операций над ними

• Доступ к объектам через коллекции

• Старайтесь придерживаться RFC 2616

• Используйте Ad Hoc-методы там где не хватает HTTP

Добавляйте в API hypermedia-контролы

HAL – http://stateless.co/hal_specification.html

Описывайте API с помощью машиночитаемых форматов

Swagger – https://helloreverb.com/developers/swagger

Page 67: Разработка RESTful api with all bells and whistles

67

Рецепт правильного REST API

• Структура в виде ресурсов и операций над ними

• Доступ к объектам через коллекции

• Старайтесь придерживаться RFC 2616

• Используйте Ad Hoc-методы там где не хватает HTTP

• Добавляйте в API hypermedia-контролы

HAL – http://stateless.co/hal_specification.html

Описывайте API с помощью машиночитаемых форматов

Swagger – https://helloreverb.com/developers/swagger

Page 68: Разработка RESTful api with all bells and whistles

68

Рецепт правильного REST API

• Структура в виде ресурсов и операций над ними

• Доступ к объектам через коллекции

• Старайтесь придерживаться RFC 2616

• Используйте Ad Hoc-методы там где не хватает HTTP

• Добавляйте в API hypermedia-контролы

HAL – http://stateless.co/hal_specification.html

• Описывайте API с помощью машиночитаемых форматов

Swagger – https://helloreverb.com/developers/swagger

Page 69: Разработка RESTful api with all bells and whistles

69

Для чего использовать API Диска

• Работа с контентом пользователей

• Синхронизация данных между устройствами

• Хранение user-related данных приложений

Page 70: Разработка RESTful api with all bells and whistles

70

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

Page 71: Разработка RESTful api with all bells and whistles

71

Роман Акинфеев

Разработчик back-end и REST API Яндекс.Диска

Клуб разработчиков:

Сервис «Полигон»: tech.yandex.ru/disk/poligon

clubs.ya.ru/apidisk/