Каков наилучший способ создания сложных запросов 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&param2=val2

Ответ 4

Извините, мое невежество...

но почему бы просто не вернуть данные с сообщением?

Я могу понять, почему неправильно обновлять данные с помощью get, но я не понимаю, почему это должно быть обязательным для обновления данных при каждом сообщении?

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

Я также подумал, что одним из принципов покоя является определение интерфейсов безстоящих (например, http-протоколов), и в этом случае сервер поддерживает состояние для решения запроса...

Я только начал читать об отдыхе, и там есть несколько вещей, которые я просто еще не понимаю...