9. SOAP
Достоинства:
● легко отображается на
серверные примитивы (если
сервер на Java)
● схема — часть стандарта
Недостатки:
● Ориентирован на глаголы
● Жёсткий и хрупкий
● XML, Карл!
● тяжело экспериментировать
10. Глава 2: все пишут на Ruby, REST рулит
PHP, конечно
11. REST
● Стиль, а не протокол
● Ориентирован на существительные (ресурсы), адресуемые URL
● Использование HTTP verbs
● Stateless
Реальность
● URL в стиле /resources/<id>
● JSON-ответы (может быть)
12. GET /racoons.json?sex=female&fertile=true&country=Ukraine,Poland
{
"meta": {"count": 1000, "page": 0, "next": 1}
"response": [
{"name": "Pumpkin", "age": 2.3, "fertile": true, "city": "Odesa"}
...
]
}
Ну или (если не повезло)
GET /get_racoons.php?filtername[1]=sex&filtervalue[1]=female&...
Или...
GET /rcnapi/<yourapikey>/for/breeding/sex/female/p1000/perform
(и спасибо, что не SOAP)
13. REST
Достоинства:
● понятие «ресурса»
● легко экспериментировать в
браузере и в коде
● естественное использование
идиом HTTP
Недостатки:
● стиль, а не стандарт
● не самоописующий
● дорогостоящая выборка
дерева ресурсов
16. GraphQL
● Предложен Facebook-ом в 2012-м
● Позволяет запросить сразу дерево ресурсов и указать необходимые
поля
● Машиночитаемая схема является частью стандарта
● JSON-подобное тело запроса «в той же форме, в которой нужен
ответ»
17. query {
racoons(limit: 100, filter: {AND: {sex: "female", fertility: true}}) {
name
city
age
children(age_gte: 3) {
name
color
deceases {
name
date
cured
}
}
}
}
18. GraphQL
Достоинства:
● машиночитаемая схема
● структурированный ответ
● понятие query language
Недостатки:
● жёсткий
● требует априорного знания
схемы
● неудобный для
экспериментирования и
discovery
● игнорирует HTTP-идиомы
(Facebook!)
● этот слайд слишком короткий
20. Чего мы хотим?
● URL для каждого ресурса
● Гибкие выборки по множеству ресурсов в бесконечном графе
разнородных объектов
● Запросы, которые удобно писать и читать (человеку и машине)
● Структурированные ответы
● Discoverability общей схемы и отдельных ресурсов
23. REST is not dead!
● OpenAPI (бывший Swagger)
● HATEOS
● Facebook Graph API (≠ GraphQL!)
graph.facebook.com/12345/?fields=comments{comments,from,id}
24. SQL
SELECT r.name, r.gender, c.name, c.color, d.name, d.date
FROM racoons r
JOIN racoons c ON c.parent_id = r.id
LEFT JOIN deceases d ON d.racoon_id = c.id
WHERE r.sex = "female" AND r.fertility = true
LIMIT 100
27. При чём здесь Semantic Web?
RDF (Resource Description Framework):
● Ресурсы определяется URL-ом
● Ресурс описывается предикатами (id, предикат, значение)
● Значение может быть базовых типов или ссылкой на другой ресурс
● Глобальные схемы и пространства имён
● SPARQL: язык запросов
28. PREFIX racoons: <https://racoons.xxx/schema>
PREFIX schema: <http://schema.org>
SELECT ?name ?age ?childName ?childDecease
WHERE {
?racoon a racoons:Racoon ;
schema:name ?name ;
schema:age ?age ;
schema:child ?child .
?child schema:name ?childName ;
racoons:decease ?childDecease .
}
SELECT → CONSTRUCT
Позволяет определить структуру графа из элементов ответа
30. Выводы!
● Правильный query language — в будущем
● GraphQL — для очень специальных случаев
● Хорошо отдизайненый REST почти непобедим
● В идеях Semantic Web что-то есть
● Еноты рулят
Виктор Шепелев aka @zverok
zverok.github.io