REST API для ресурсов, вычисляемых на лету (которые еще не существуют) - PullRequest
0 голосов
/ 01 марта 2019

(Хобби-кодер, пожалуйста, потерпите меня)

Я пытался найти это, но не смог найти шаблон или ответ, который смутил меня, поскольку это должно быть распространенной проблемой?

IПишу простой сервис оценки акций.Мой API принимает символ Stock, например, «stockdata / GOOG», и возвращает некоторую вычисленную статистику.Конечно, базовые данные об акциях часто меняются, и мне нужно время от времени пересчитывать.Я пытаюсь понять, как элегантно обрабатывать 2 вещи

1) Запросы пользователей на складе, мой сервис еще не видел : учитывая наличие 10000 ценных бумаг, это не кажется разумнымили необходимо, чтобы предварительно вычислить их все.REST мудрый, это смутило меня, хотя, как я понимаю, я должен действительно вернуть 404, если у меня нет данных.Дело в том, что если акция действительна, я могу получить базовые данные и вычислить свои собственные оценки.Как мне это сделать?В настоящее время я обновляю как побочный эффект, но это кажется неприятным.Единственный другой метод REST, который приходит на ум, - это попросить пользователей PUT / POST символ (без данных), и это может побудить меня создать / вычислить.Это кажется мне странным, так как все примеры, которые я видел, включают эти методы, предоставляющие много дополнительных данных для представления этого ресурса.(Все, что мне нужно, это сам символ, и мой сервис может сделать все остальное. То есть GET содержит всю информацию, необходимую для вычисления / создания ресурса)

2) Состояние обновления : какданные меняются все время, я хочу пересчитать, но не более одного раза в день, иначе я забиваю исходные серверы без необходимости.Как с вышеупомянутым, как я должен вызвать обновление?На данный момент мой GET проверяет валюту и обновления, если он старше, чем день, но опять же, это не кажется RESTy.Должен ли я просто вернуть устаревшие данные и снова предоставить их пользователю, чтобы он сделал еще один звонок для запроса обновления?Будет ли это хорошим вариантом использования патча?

Как вы посоветуете мои полезные нагрузки для этих POST / PUT / PATCH должны выглядеть?

Спасибо, Сев

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Дело в том, что при условии, что акции действительны, я могу получить базовые данные и вычислить свои собственные результаты.Как мне это сделать?В настоящее время я обновляю как побочный эффект, но это кажется неприятным

. Относиться к этому как к GET, где реализация имеет побочные эффекты в своем собственном кэше, хорошо.Вот Филдинг, поддерживающий эту позицию в 2002 году.

HTTP не пытается требовать, чтобы результаты GET были безопасными.Для этого требуется, чтобы семантика операции была безопасной, и, следовательно, это ошибка реализации, а не интерфейса или пользователя этого интерфейса, если в результате произойдет что-либо, что приведет к потере имущества (денег, кстати,для этого определения считается свойством).

Тот факт, что вы хотите выполнить кучу побочных эффектов (чтение некоторого состояния, возможно, обновление вашего локального кэша), является деталью реализации, а непредставляет интерес для клиента.

Поскольку данные меняются все время, я хочу пересчитать их, но не более одного раза в день, иначе я излишне забиваю исходные серверы.Как с вышеупомянутым, как я должен вызвать обновление?В данный момент мой GET проверяет валюту и обновления, если он старше суток, но опять же это не похоже на RESTy.

Вопрос, который вы задаете: как ваша реализация должна управлять своим кешем?И ответ в значительной степени "как хочешь".Сохранение возраста для вашего последнего рассчитанного результата и его повторное использование - совершенно нормальная вещь.На самом деле клиент не беспокоится, возвращаете ли вы кэшированное представление или только что вычисленное.

Вопрос, который вы не задаете: если вы обновляете локальную копию только один раз в день, не так уж многоУкажите, что клиент проверяет наличие обновлений чаще, чем это.Стандарт HTTP включает семантику кэширования , предоставляя вам стандартный способ передачи семантики свежести / аннулирования клиенту.

0 голосов
/ 01 марта 2019

Вы путаете «у меня нет кэшированных данных» с «нет данных».Клиенты на самом деле не создают и не обновляют данные, они хотят получить последнюю версию.GET должен работать просто отлично.Если вам как провайдеру нужно проделать определенную работу, чтобы вернуть последнюю версию, тогда все в порядке, это все еще GET.

То же самое относится и к обновлениям.Пользователям нужна текущая версия данных, поэтому они должны использовать GET.Если данные изменятся, они получат новую версию, в противном случае они получат старую версию.Обычные веб-страницы работают таким же образом, веб-сервер возвращает текущую версию, а иногда данные изменяются.

Если вы знаете, когда вы будете изменять данные, рекомендуется возвращать заголовок Cache-Control сmax-age или использовать заголовок Expires или оба.Таким образом, клиенты знают, что они могут кэшировать старые данные, но не навсегда.

...