Каков наилучший способ создания сложных запросов RESTful?
Какой лучший способ получить сложные запросы от службы REST?
Предположим, что я хочу получить коллекции X, применить фильтры и уравнения к каждому из них, объединить коллекции, используя некоторую другую операцию, и вернуть один результат, все в одном запросе.
Это слишком сложно (и большой), чтобы поместить все в очередь, поскольку я мог объединить более 300 коллекций (плюс операторы и фильтры для каждого).
Я думал об использовании POST для отправки объекта XML, описывающего запрос, примерно так:
http://mydomain/collections/complexQuery
Он вернет уникальный идентификатор, а затем я смогу использовать GET для получения результата complexQuery:
http://mydomain/collections/complexQuery/{queryId}
Джейсон С:
Это идея. POST примет XML-представление запроса, а параметры "where" уже (их может быть слишком много). Запрос будет выполнен только тогда, когда появится GET. Я могу позволить объекту запроса быть доступным только на некоторое время и удалить его позже.
Это хорошее решение? Я все еще RESTful делаю это?
Ответы
Ответ 1
Звучит RESTful для меня, если вы используете уникальный идентификатор. Если набор результатов запроса велик, вы можете включить способ запроса строк набора результатов M - N, где M, N - параметры.
Я полагаю, что преимущество вашего уникального подхода к идентификатору (состояние определения запроса/запроса на сервере), вы можете использовать результат запроса в качестве параметра другого запроса. Возможно, даже выделите POSTING определение запроса из выполнения запроса.
Ответ 2
Это стандартный подход RESTful. POST
к ресурсу и ожидать a 201 Created
(без тела объекта) с URI для созданных результатов в заголовке Location
. Вы также можете вернуть результаты с ответом 200 OK
и, при необходимости, URI, указывающим на результаты для будущей (де) ссылки в ответе вместе с копией результатов.
Ответ 3
Все в порядке. Но он вводит несколько проблем:
- Вам нужно сохранить данные запроса на сервере, когда вы очищаете старые запросы?
-
Если вы очищаете старые запросы, это означает, что вы не можете предоставлять ссылки на сохраненные запросы, потому что они, возможно, уже были очищены.
-
Даже простой запрос требует двух раундов (POST, а затем GET)
- Ваш клиент должен знать схему XML, которую вы ожидаете, а не хорошо известную:
param1=val1¶m2=val2
Ответ 4
Извините, мое невежество...
но почему бы просто не вернуть данные с сообщением?
Я могу понять, почему неправильно обновлять данные с помощью get, но я не понимаю, почему это должно быть обязательным для обновления данных при каждом сообщении?
Я также понимаю, что идея состоит в том, что каждый метод get может быть потенциально кэширован (поскольку они не изменяют данные), но в этом случае они могут быть кэшированы, только если временно сохраненный запрос все еще активен... который добавляет еще один уровень сложности...
Я также подумал, что одним из принципов покоя является определение интерфейсов безстоящих (например, http-протоколов), и в этом случае сервер поддерживает состояние для решения запроса...
Я только начал читать об отдыхе, и там есть несколько вещей, которые я просто еще не понимаю...