2015-08-27 2 views
1

Если у меня есть два ресурса, где один создается из другого, где я должен поставить конечную точку создания?REST API Design: Где создать ресурс, который зависит от другого ресурса?

Пример:

У меня есть два ресурса, А и В, и я хочу, чтобы создать B.

B является простой класс, который ссылается на A, и пользователь, который создал его, как этот

public class B { 
    private A a; 
    private User user; 
} 

Информация о пользователе отправляется неявно с запросом HTTP, поэтому мне не нужны никакие параметры для этого.

Решение 1:

Отправить POST без каких-либо аргументов /A/123/B и вернуть B. Это означает, что контроллер A ответственен за создание B. Чувствует себя странно.

Решение 2:

Отправить POST с идентификатором 123, /B. Это означает, что я должен проверить контроллер для B, если существует A с идентификатором 123. Чувствует себя также странно.

Каковы преимущества и недостатки обоих решений? Я задумываюсь над дизайном API?

ответ

2

Вам нужно четко указать зависимость.

Существует ли А, состоящее из B? Другими словами, существует ли B из сферы?

  1. Если ответ да, то B может быть живым без А, то лучше иметь отдельные ресурсы:

    POST ./B 
    

Вы должны избегать ресурса место на другом пути к месту назначения. Некоторые могут утверждать, что REST не заставляет вас иметь одну конечную точку для одного ресурса, но сохранение согласованности между разными конечными точками не так очевидно. Что произойдет с B, если вы пришлете DELETE ./A/{id}?

  1. Если ответ отрицательный, это означает, что B не может существовать, если существует A, тогда лучше иметь B как под-ресурс.

    POST ./A/{id}/B 
    

Говоря о контроллере, нет ничего, что заставит вас от управления B от другого контроллера. Весь смысл REST состоит в том, что вызов - это не адрес контроллера, а ресурс. Ресурсы, которые вы создаете, не зависят от контроллера.

+0

Спасибо за ваше ясное и совершенно очевидное объяснение! – zersaegen