Роман Акинфеев «Разработка restful api with all bells and whistles»

71
1

Upload: devday

Post on 14-Jun-2015

278 views

Category:

Software


0 download

DESCRIPTION

Каждый уважающий себя интернет-сервис, ориентированный больше чем на одну платформу, сегодня имеет RESTful API. Но мало кто понимает что такое REST, с чем его едят, как готовят и чем он полезен для здоровья. Кто-то считает, что RESTful API - это API использующее в качестве транспорта протокол HTTP, кто-то думает, что REST - это стандарт в рамках которого разработчики ограничены набором ресурсов и восьмью операциями над ними. Я расскажу о том как мы в Яндекс.Диске понимаем REST, как его готовим и какую пользу он нам приносит.

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/