Как передать сложные запросы в REST?

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

Я прав?

Ну, у меня есть несколько приложений, которые связываются с БД через сообщение 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-код можно было легко сопоставить с rest или JSON.

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

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

2 ответа

Решение

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

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

Это не идеально, но работает.:)

Другие вопросы по тегам