Slide 1

Slide 1 text

Hypermedia API 1

Slide 2

Slide 2 text

Артём Бей @defly_self Fullstack dev в Trinity Mirror 2

Slide 3

Slide 3 text

3

Slide 4

Slide 4 text

Representational State Transfer “Architectural Styles and the Design of Network-based Software Architectures” Roy Fielding 4

Slide 5

Slide 5 text

REST это архитектурный стиль для распределенных гипермедиа систем. 5

Slide 6

Slide 6 text

REST != HTTP 6

Slide 7

Slide 7 text

Ресурс http://…/resource { entity: {…} } 7

Slide 8

Slide 8 text

http://…/resource { entity: {…} } представление представление ресурс идентификатор документ картинка процесс … 8

Slide 9

Slide 9 text

Richardson Maturity Model 9

Slide 10

Slide 10 text

REST уровня 0 POST /api { "do": "createOrder", "params": { "count": 2 } } POST /api { "do": "cancelOrder", "params": { "id": "34xzfha834flksd34" } } 200 OK { "success": true, "res": { "id": "f239sdk237sdf438" } } 200 OK { "success": false, "error": { "code": 666, "message": "because fk u thats why" } } /api 10

Slide 11

Slide 11 text

REST уровня 1 POST /users {…} 200 OK { "success": true, "res": { "id": "f239sdk237sdf438" } } 200 OK { "success": false, "error": { "code": 40000, "message": "not valid req" } } /users POST /users/1 {…} POST /orders {…} /users/1 /orders 11

Slide 12

Slide 12 text

REST уровня 2 12

Slide 13

Slide 13 text

REST уровня 2 Используем HTTP по спецификации 13

Slide 14

Slide 14 text

GET POST PUT DELETE OPTIONS HEAD PATCH … 14

Slide 15

Slide 15 text

15

Slide 16

Slide 16 text

200 OK { "success": false, "error": { "code": 666, "message": "because fk u thats why" } 16

Slide 17

Slide 17 text

400 Bad Request 401 Unauthorized 403 Forbidden 404 Not Found 402 Payment Required 409 Conflict … 17

Slide 18

Slide 18 text

418 I’m a teapot P.S. Больше статусов на: http://httpstatusdogs.com/ https://http.cat/ 18

Slide 19

Slide 19 text

/users /orders /profile … GET POST PUT DELETE OPTIONS HEAD PATCH … 200 201 … 300 301 … 400 401 … 500 501 … покроют все ваши кейсы 19

Slide 20

Slide 20 text

REST уровень 3 20

Slide 21

Slide 21 text

Гипертекст 21

Slide 22

Slide 22 text

HATEOAS Hypermedia As The Engine Of Application State 22

Slide 23

Slide 23 text

представление ресурса = данные + контролы 23

Slide 24

Slide 24 text

GET /feed 200 OK { "data": [ { "title": "...", "links": { "details": "http://..." } }, .... ], "links": { "self": "http://...", "first": "http://...", "prev": "http://...", "next": "http://...", "last": "http://..." } } 24 << < > >>

Slide 25

Slide 25 text

GET /feed?min_id=100500 200 OK { "data": [ { "title": "...", "links": { "details": “http://..." } }, .... ], "links": { "self": "http://...", "first": "http://...", "prev": "http://...", "next": "http://...", "last": "http://..." } } 25 << < > >>

Slide 26

Slide 26 text

GET /films/themartian 200 OK { "data": { "title": "Марсианин", "description": "Как Мэт Дэймон выращивал картошку на Марсе", "duration": 140, "poster": "https://s3.amazon.com/buckets/23aGd23asdsf.png" }, "links": { "self": "http://.../themartian", "booking": "http://.../themartian/bookings" } } 26

Slide 27

Slide 27 text

OPTIONS /films/themartian/bookings 204 No Content Allow: HEAD,GET,POST,OPTIONS 27 GET /films/themartian 200 OK { "data": { "title": "Марсианин", "description": "Как Мэт Дэймон выращивал картошку на Марсе", "duration": 140, "poster": "https://s3.amazon.com/buckets/23aGd23asdsf.png" }, "links": { "self": "http://.../themartian", "booking": "http://.../themartian/bookings" } }

Slide 28

Slide 28 text

POST /films/themartian/bookings { count: 3 } 201 Created Location: http://..../bookings/1 28

Slide 29

Slide 29 text

GET /films/themartian/bookings/1 200 OK { "data": { "count": 3, "date": "Tue Nov 03 2015 21:45:55 GMT+0200 (EET)", "status": "waiting" }, "links": { "self": "http://..../bookings/1", "cancel": "http://..../bookings/1/cancel", "pay": "http://.../bookings/1/pay" } } 29

Slide 30

Slide 30 text

Стейт-машина Переходим в новые состояния по ссылке 30

Slide 31

Slide 31 text

Состояние вычисляется в одном месте

Slide 32

Slide 32 text

Забываем о формировании URL на клиенте

Slide 33

Slide 33 text

Распределённые приложения "links": { "self": "http://...", "upload": "http://...s3.amazonaws.com/", "pay": "https://api.stripe.com/v1/charges/", "convert": "https://...docx2pdf.mcrsrvs.com/" }

Slide 34

Slide 34 text

Discoverability

Slide 35

Slide 35 text

Developer Experience

Slide 36

Slide 36 text

Некоторые приёмы • Безопасные и идемпотентные операции • Кеширование неизменяемых ресурсов • X- заголовки • Вендорные типы данных (application/ vnd.myapi.basket.v1+json) 36

Slide 37

Slide 37 text

Вопросы к HATEOAS 37

Slide 38

Slide 38 text

В JSON нет ссылок и форм Есть спецификации: HAL, Siren, json:api 38

Slide 39

Slide 39 text

Нужна ли теперь документация? Нужна. REST для машин. 39

Slide 40

Slide 40 text

Слишком академично или много лишнего Не нужно реализовывать спецификации в полном объёме 40

Slide 41

Slide 41 text

Почитать • https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm • http://roy.gbiv.com/untangled/2008/rest-apis-must-be- hypertext-driven • http://martinfowler.com/articles/ richardsonMaturityModel.html • http://www.jeffknupp.com/blog/2014/06/03/why-i-hate- hateoas • http://timelessrepo.com/haters-gonna-hateoas

Slide 42

Slide 42 text

Спасибо, задавайте вопросы! 42