2014-02-18 3 views
2

Мы пытаемся перестроить наш SOAP API на RESTful (используя ASP.NET Web Api).RESTful представление вызова RPC

Я знаю, что вопрос о том, как заменить вызовы в стиле RPC с помощью REST, очень много, но я все еще не нашел ничего, что меня достало, где я хочу. Это может быть провал воображения или фундаментальное непонимание принципов REST (я позволю вам быть судьей этого!)

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

Предположим, у нас есть ресурс, который я буду называть Бронирование

... GET/Заказ/бронирование/1

И у нас есть требование отменить этот заказ, который ранее были бы смоделированы с чем-то вроде.

... CancelBooking (1, Reasons.NoLongerRequired)

Так это ID бронирование и код причины.

Возможно, нам потребуется возможность отменить несколько заказов по одному запросу.

... CancelBooking ("1,2,3", Reasons.NoLongerRequired)

(Немного сырой, но я стараюсь держать пример простой!)

Как будем ли мы лучше всего моделировать это в архитектуре RESTful?

Одно из предложений заключается в том, что у нас есть ресурс, называемый чем-то вроде CancellationRequest, и мы отправляем один из них на сервер?

POST .../Bookings/CancellationRequest  
{ 
    "BookingIDs" : "1,2,3", 
    "CancellationReason" : "NotRequired" 
} 

Возможно, это выполнит обработку, а затем вернет перенаправление на отмененные бронирования (-ы)?

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

Может ли кто-нибудь посоветовать?

ответ

2

(Одно замечание: излишне сказать /Bookings/Booking/:id. Я также считаю, что ресурсы должны начинаться с строчных букв. В этом случае вы должны обращаться к ресурсу как /bookings/:id).

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

Однако, ваше дело, кажется, довольно просто:

Множественные ресурсы:

DELETE /bookings?reasonCode=Reasons.NoLongerRequired&id=1&id=2&id=3 

один ресурс:

DELETE /bookings?reasonCode=Reasons.NoLongerRequired&id=1 

, которая вырождается

DELETE /bookings/:id?reasonCode=Reasons.NoLongerRequired 

Также см Patterns for handling batch operations in REST web services?

+0

Большое спасибо. (И да, я не совсем уверен, почему я описываю включенные дополнительные/заказы - недостаток сна, вероятно! Я также возьму на борт то, что вы сказали о нижнем регистре). Предположим, мы хотим сохранить бронирование в качестве записи. Предположим, что глагол - это что-то вроде «suspend»? Что-то, что указывает, что мы хотим что-то сделать для этого бронирования, но мы не хотим его удалять. По существу изменение статуса. Я думаю, что я говорю, что я использовал плохой пример с «cancel». (нехватка сна снова?). Я взгляну на ссылку, которую вы включили. Еще раз спасибо. –

+0

Это просто обновление, поэтому правильным глаголом будет 'PUT' с соответствующей полезной нагрузкой:' PUT/bookings /: id' с полезной нагрузкой чего-то типа {{status ":" cancel "," reason ":" Reasons.NoLongerRequired "}'. Я работал над многими системами, которые моделировали их «аннулирования» таким образом, и nary «DELETE», которые можно найти в API. – Palpatim

+0

@Palpatim a PUT, как это было бы неуместно, так как PUT должен обновить весь ресурс, чтобы он соответствовал вашему телу. Это будет означать, что весь запрос на бронирование должен быть в вашем запросе, чтобы он был правильным; только отправка его частей (например, Status) приведет к обнулению всех остальных полей. Частичные обновления, такие как PATCH. Однако я не думаю, что это должен быть DELETE либо с тех пор, как ресурс фактически не удаляется. Чтобы использовать DELETE, я бы сказал, что было бы уместно, если бы этот ресурс больше не имел выборку после DELETE. – Sinaesthetic

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