2009-05-16 8 views
6

Если я правильно понимаю, в стиле отдыха, каждый запрос (то есть каждое действие на каждом ресурсе, который не изменяет состояние ресурса) должен быть закодирован в строке запроса, используя метод get, без тела вообще.Как передать сложные запросы в REST?

Я прав?

Ну, у меня есть несколько приложений, которые общаются с db через XML-сообщение, которое обрабатывается компонентом Visual Basic 6.

сообщение для запроса что-то вроде этого

<xml> 
    <service>account</service> 
    <resource>invoice</resource> 
    <action>query</action> 
    <parameters> 
    <page>1</page> 
    <page_len>10</page_len> 
    <order>date</order> 
    <fields>*</fields> 
    <conditions> 
     <date>2009-01-01..2009-01-31</date> 
     <customer_id>24</customer_id> 
    </conditions> 
    </parameters> 
</xml> 

Сейчас мы находимся в процессе реорганизации наших XML-сообщения, и мы хотели бы сделать это таким образом, чтобы они могли быть легко сопоставлен с интерфейсом RESTful.

В предыдущем примере нам нужны теги «условия», чтобы предотвратить столкновение между параметрами и условиями (т. Е. Что произойдет, если у меня есть поле с именем «порядок», «страница» или что-то в этом роде. ..

Подумали об отправке параметров с префиксом, что-то вроде

http://account/invoice/?_page=1&_page_len=10&_order=date&_fields=*&date=2009-01-01..2009-01-31&customer_id=24 

и XML, будет что-то вроде

[...] 
    <_order>date</_order> 
    <_fields>*</_fields> 
    <date>2009-01-01..2009-01-31</date> 
    <customer_id>24</customer_id> 
[...] 

Мы пытаются определить какой-то действительно простой формат XML для операций crud и что полученный XML может быть легко отображен для отдыха или JSON.

Как бы вы могли сопоставить этот запрос в приложении для отдыха? Есть ли определенный стандарт? или на какой-либо странице с образцами crud rest/XML/JSON? как насчет возврата ошибки или вложенных наборов данных?

Большое спасибо.

ответ

6

IMHO, чтобы ваша система действительно RESTful, вы должны переосмыслить все сообщения/запросы, которые вы будете отправлять.

Эта часть:

<conditions> 
    <date>2009-01-01..2009-01-31</date> 
    <customer_id>24</customer_id> 
</conditions> 

сложная часть. Какие еще условия у вас есть? Много ли? Этот конкретный пример заставляет меня думать, что вы можете обрабатывать счета-фактуры как субресурс клиента. Когда я отдыхаю, я всегда пытаюсь определить ресурс в пути, и если для запроса требуется какие-либо параметры, я перемещаю их в строку запроса. Поэтому я бы написал примерно следующее:

GET /customers/24/invoices?start_date=2009-01-01&end_date=2009-01-31 

Подумайте об отношениях между вашими ресурсами. Допустим, у нас есть тип ресурса типа Foo, связанный с отношением -to-many. В этом случае вы можете спросить об этом отношении следующим образом: GET /foo/123/bar и добавить параметры строки запроса для его фильтрации. Проблема начинается, когда вы хотите отфильтровать ее таким образом, чтобы она включала отношения с другими ресурсами. ИМХО это означает, что ваш дизайн ресурсов не является действительно RESTful.

0

Вам понадобится url-encode xml, чтобы передать его, но если вы преобразовали xml в json, вы можете передать эту строку, а затем json-> xml или json-> object для ее обработки. Это позволит вам передавать более сложные объекты.

Не совершенен, но работает. :)

+0

Я подхожу к вашему подходу, но я хотел бы сделать, как это будет сделано в соответствии с принципами покоя, а не просто наполнить мой собственный xml в queryString ... – opensas

+0

Это зависит от того, как, как уже упоминалось, вы можете переосмыслить, как вы следует отправлять данные, но если вы просто отправляете данные, которые должны быть помещены в базу данных, тогда кодирование, чтобы оно могло быть отправлено в URL, имеет смысл. Если вы используете GET, у вас будет другой подход. –