Извиняюсь заранее, если качество вопроса плохое. Я все еще начинаю изучать концепции REST API. Я пытаюсь реализовать масштабируемый REST API для обработки данных. Вот что я мог додумать до сих пор.
Рассмотрим некоторые числовые данные, которые можно получить с помощью вызова GET
:
GET http://my.api/data/123/
Пользователи могут применять последовательность арифметических операций, таких как add
и multiply
. Не-RESTful способ сделать это:
GET http://my.api/data/123?add=10&multiply=5
Assupmtions:
- Исходные данные в БД не изменены. Только измененная версия возвращается пользователю.
- Данные большие по размеру (скажем, большой многомерный массив), поэтому мы не можем позволить себе возвращать целые данные при каждом вызове операции. Вместо этого мы хотим применить операции в виде пакета и вернуть окончательные измененные данные в конце.
Есть 2 способа RESTful, которые я сейчас просматриваю:
1. Арифметические операции модели как субресурсы данных.
Если мы рассмотрим add
и multiply
как подресурсы данных как здесь. В этом случае мы можем использовать:
GET http://my.api/data/123/add/10/
который был бы безопасным и идемпотентным, учитывая, что исходные данные никогда не изменяются. Однако нам нужно связать несколько операций. Можем ли мы это сделать?
GET http://my.api/data/123/add/10/multiply/5/
Где multiply
создает подресурс add/10/
, который сам является подресурсом data/123
Плюсы:
- Безгражданство. Разделение не содержит никакой информации об измененных данных.
- Легкий доступ к измененным данным: это просто простой вызов GET.
Минусы:
- Цепочка: я не знаю, можно ли ее легко реализовать.
- Длинные URI: при каждой применяемой операции URI увеличивается дольше.
2. Создайте редактируемый объект данных:
В этом случае пользователь создает редактируемую версию исходных данных:
POST http://my.api/data/123/
вернет
201 Created
Location: http://my.api/data/123/edit/{uniqueid}
Теперь пользователи могут PATCH
редактировать данные, доступные для редактирования
PATCH http://my.api/data/123/edit/{uniqueid}
{add:10, multiply:5}
И наконец, GET
отредактированные данные
GET http://my.api/data/123/edit/{uniqueid}
Плюсы:
- Очистить URI.
Минусы:
- Серверу необходимо сохранить состояние редактируемых данных.
- Редактирование не является длинным идемпотентом.
- Для получения отредактированных данных требуется, чтобы пользователи выполняли не менее 3 вызовов.
Есть ли более чистый, более семантический способ выполнения обработки данных RESTfully?
Изменить:
Если вам интересно, что это за реальная проблема, я занимаюсь цифровой обработкой сигналов.
В качестве простого примера вы можете подумать о применении визуальных фильтров к изображениям. Следуя этот пример, веб-служба RESTful может делать:
GET http://my.api/image/123/blur/5px/rotate/90deg/?size=small&format=png