Каков наилучший способ создания сложных запросов RESTful?

Каков наилучший способ получения сложных запросов из службы REST?

Предположим, я хочу получить коллекции X, применить фильтры и уравнения к каждой из них, объединить коллекции с помощью какой-либо другой операции и вернуть один результат, все в одном запросе.

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

Я думал об использовании POST для отправки объекта XML, описывающего запрос, примерно так:

http://mydomain/collections/complexQuery

Он вернул бы уникальный идентификатор, а затем я мог бы использовать GET для получения результата complexQuery:

http://mydomain/collections/complexQuery/{queryId}

Джейсон С:

Это идея. POST будет принимать XML-представление запроса с уже имеющимися параметрами "где" (их может быть слишком много). Запрос будет выполнен только тогда, когда прибудет GET. Я мог бы сделать объект запроса доступным только на некоторое время и удалить его позже.

Это хорошее решение? Я все еще RESTful, делаю это?

4 ответа

Решение

Звучит RESTful для меня, если вы используете уникальный идентификатор. Если набор результатов запроса большой, вы можете включить способ запроса строк набора результатов M - N, где M,N - параметры.

Я предполагаю, что преимущество вашего подхода с уникальным идентификатором (с сохранением состояния запроса на сервере) заключается в том, что вы можете использовать результат запроса в качестве параметра другого запроса. Возможно, даже отделить POSTING от определения запроса от его выполнения.

Это стандартный подход RESTful. POST к ресурсу и ожидать 201 Created (без тела объекта) с URI для созданных результатов в Location заголовок. Вы также можете вернуть результаты с 200 OK ответ и, необязательно, URI, указывающий на результаты для будущей (де) ссылки в ответе вместе с копией результатов.

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

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

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

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

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

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

Все в порядке. Но это вводит несколько проблем:

  1. Вы должны сохранить данные запроса на сервере, когда вы очищаете старые запросы?
  2. Если вы очищаете старые запросы, это означает, что вы не можете предоставить ссылки на сохраненные запросы, поскольку они, возможно, уже были очищены.

  3. Даже простой запрос требует двух циклов (POST и GET)

  4. Ваш клиент должен быть знаком с ожидаемой XML-схемой, а не с хорошо известной: param1=val1&param2=val2
Другие вопросы по тегам