Restlet: запросы GET с использованием запросов, которые обращаются к более чем одному ресурсу.

Допустим, в базе данных у меня есть имя и дата рождения многих людей, и я хочу ПОЛУЧИТЬ имена людей старше 20 лет. Я мог бы использовать что-то вроде этого:

http://www.example.com/people?age=over20

В этом случае маршрутизатор прикрепит этот uri к классу ресурсов People. Существуют ли какие-либо функции, которые могли бы проанализировать uri и получить необходимый запрос (в этом примере возраст> 20)? или я должен написать свои собственные функции?

Еще одна проблема, в этом примере запрос ( age>20 ) простой, поэтому его можно включить в uri, что, если у меня есть сложные запросы (объединение между двумя таблицами и т. д.)? я должен поместить запрос в файл xml и отправить его на сервер?


person SLA    schedule 19.06.2011    source источник
comment
Если вы поместите запрос в тело объекта GET, один и тот же шаблон URI теперь сопоставляется с огромным количеством различных ресурсов. Это означает, что кеширование ответов на запросы становится невозможным, вы не можете отправлять ссылки на запросы по электронной почте, закладки запросов не работают и так далее. Принцип REST предоставления каждого отдельного ресурса приложения через его собственное имя ресурса (URI в HTTP) позволяет избежать всех этих проблем.   -  person Jim Ferrans    schedule 19.06.2011


Ответы (1)


Существуют ли какие-либо функции, которые могли бы проанализировать uri и получить необходимый запрос (в этом примере возраст> 20)?

Да, есть функции для разбора строки запроса. В этом конкретном случае, используя Restlet, вы можете получить значение в своем ресурсе через: getRequest().getResourceRef().getQueryAsForm().getFirst("age").getValue() == "более 20"

Могут быть и другие способы (и, возможно, это улучшено в Restlet 2.0), но по моему опыту, Restlet, по крайней мере, был очень структурированным и многословным. С тех пор я перешел на JAX-RS и Jersey, чтобы создавать свои ресурсы, поскольку это позволяет мне делать то же самое с помощью всего нескольких аннотаций. (в данном случае @QueryParam("age").) Вы можете подумать о том, чтобы сделать часть ключа больше/меньше вместо значения, чтобы вам было легче анализировать строку и строить свой запрос. Идея заключалась в том, что это была бы разница между попыткой обрабатывать: http://www.example.com/people?age=over20&age=under30

по сравнению с обработкой: http://www.example.com/people?ageAtLeast=20&ageAtMost=30

Еще одна проблема, в этом примере запрос ( age>20 ) простой, поэтому его можно включить в uri, что, если у меня есть сложные запросы (объединение между двумя таблицами и т. д.)?

Здесь я бы порекомендовал поискать обсуждения дизайна Restful URI. В идеале разные объекты должны быть разными путями uri, и их отношения будут очевидны через ваш URL. Например, был вопрос, получивший большое количество голосов: RESTful URL-адрес для поиска

я должен поместить запрос в файл xml и отправить его на сервер?

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

person Charlie    schedule 19.06.2011