Как передать сложные запросы в REST? - PullRequest
6 голосов
/ 16 мая 2009

Если я правильно понимаю, в стиле 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 ]

6 голосов
/ 16 мая 2009

ИМХО, чтобы сделать вашу систему действительно 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.

0 голосов
/ 16 мая 2009

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

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

...