2012-04-27 2 views
7

У меня есть служба REST, которая обслуживает функциональность счета, например, я могу создавать, обновлять и удалять счета через службу REST.RESTful слияние и разделение ресурсов

Однако теперь мне необходимо иметь функциональные возможности для разбивки счета на несколько новых счетов-фактур, то есть для этого необходимо создать x счетов-фактур на основе одного счета-фактуры, а затем удалить исходный счет-фактуру в одной транзакции.

Мне также нужен метод слияния, который делает обратное, то есть несколько счетов-фактур, объединенных в один.

Как создать такой проект RESTful?

ответ

4

У нас была аналогичная проблема, когда мы хотели объединить 2 ресурса. После долгих дебатов мы решили, что потребитель будет использовать ресурс запроса слияния, содержащий два ресурса для объединения. Затем, посмотрев на это, мы решили, что нет необходимости как для полного источника, так и для целевого ресурса, и вместо этого достаточно POST только уникального идентификатора. Мы не делали запрос на слияние только с двумя идентификаторами, входящими в тело. Это было проще представлять в URL-адресе, так что это мы и сделали. Ответ от POSTing запроса слияния является объединенным ресурсом.

Я думаю, что я недостаточно гуру REST, чтобы сказать вам, что это была хорошая стратегия или нет, но для нас это было простое решение, поэтому мы пошли с ним.

2

Когда вы говорите, что хотите реализовать эту функцию в «одной транзакции», я предполагаю, что вы уже определили, что вы должны комбинировать генерацию новых счетов и удаление старого в один вызов API; что является правильным подходом. С веб-службами вы хотите уменьшить болтовню, и, вероятно, есть некоторые бизнес-логики о том, как эта функция будет генерировать новые счета и удалять старые. Поэтому я предполагаю, что когда вы спросите, как это сделать в RESTful, вам интересно, какой HTTP-глагол использовать (т. Е. GET, POST, PUT или DELETE) для этого нового метода API. Обычно эти глаголы карта для операций типа CRUD следующим образом:

  • Создать -> POST
  • Чтение -> GET
  • Update -> PUT
  • Удалить -> DELETE

Итак, какой глагол использовать, когда ваша функция создает и удаляет записи. Общее правило с API REST - это если нет четкого сопоставления с CRUD, тогда используйте POST, если есть изменение состояния сервера и GET, если вы просто возвращаете информацию, которая не меняет состояние сервера. Поэтому в этом случае я бы пошел с POST.

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

+0

Привет Кевин, вы можете предложить, как URL должен выглядеть для этого расщепления/слияния операций? –

-1

Я хотел бы сделать что-то вроде,

POST /InvoiceSplitter?sourceInvoiceId=99 

и

POST /InvoiceMerger?sourceInvoiceIds=101,87,23,45 
+1

Эти URL-адреса выглядят неудобно, если вы идентифицируете ресурсы по некоторому ID, а не по URL-адресу. Я бы сделал что-то вроде «POST/path/to/invoice/99? Split = true» или для слияния 'POST/path/to/invoice/99? MergeWith =/path/to/invoice/101' –

+0

@AlexanderKlimetschek нет такой вещи, как URL RESTful.Я использую понятие «ресурса обработки», как определено в спецификации HTTP. Ваши примеры тоже прекрасны. Однако убедитесь, что вы избежите косой черты для значения параметра строки запроса. –

Смежные вопросы