REST Api для ресурсных ассоциаций

Пытаясь смоделировать интерфейс REST для системы, мне трудно понять, какой подход будет наилучшим.

Рассмотрим наличие объекта типа resource и другой объект, который описывает их ассоциации: resourceAssoc, Ассоциации могут быть n типы, но это не важно.

В случае resource API будет тривиальным:

/resources 
/resource/{resource_id}

Что будет лучшим подходом для resourceAssoc учитывая, что его идентификатор состоит из: PK(from_resource_id, to_resource_id, association_type)?

2 ответа

Я надеюсь, что мой ответ даст некоторые подсказки, так как я не совсем понимаю ваш вопрос;-)

На самом деле, я вижу следующие возможности в отношении URL-адресов REST и содержимого ответа:

  • / ресурсов /{resource_id}/ ассоциации /

    [
      {
        "toResourceId": "resourceid1",
        "associationKind": "kind1",
        (...)
      },
      {
        "toResourceId": "resourceid2",
        "associationKind": "kind2",
        (...)
      }
      (...)
    ]
    
  • / ресурсов /{resource_id}/ объединения /{to_resource_id}

    [
      {
        "associationKind": "kind1",
        (...)
      },
      {
        "associationKind": "kind2",
        (...)
      }
      (...)
    ]
    
  • / ресурсов /{resource_id}/ объединения /{to_resource_id}

    {
      (...)
    }
    

Следующие вводят новый путь корневого ресурса associations, В этом случае вы можете управлять ассоциациями независимо от ресурсов с корневым путем. resources,

  • / ассоциации / {from_resource_id}, {to_resource_id} /

    [
      {
        "fromResourceId": "resourceid1",
        "toResourceId": "resourceid2",
        "kind": "kind1",
        (...)
      },
      (...)
    ]
    
  • / ассоциации /{from_resource_id},{to_resource_id}/{вид}

    {
      "fromResourceId": "resourceid1",
      "toResourceId": "resourceid2",
      "kind": "kind1",
      (...)
    }
    

Обратите внимание, что вы можете применить несколько HTTP-методов к этим URL-адресам, чтобы получать контент, а также управлять им (обновлять, удалять).

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

Вот образец:

GET /resources/<resource_id>/associations/
[
    {
        "toResourceId": "resourceId1",
        "kind": "kind"
        (...)
    },
    {
        "toResourceId": "resourceId2",
        "kind": "kind"
        (...)
    },
    (...)
]

Чтобы управлять этими ассоциациями, вы можете реализовать метод PATCH описание того, что вы хотите обновить:

PATCH /resources/<resource_id>/associations/
[
    { "action": "add", "toResourceId":"resourceId1","kind":"kind1" (...) },
    { "action": "delete", "toResourceId":"resourceId2","kind":"kind2" (...) },
]

Эта ссылка может помочь вам в этом подходе: http://williamdurand.fr/2014/02/14/please-do-not-patch-like-an-idiot/.

В заключение, мы можем заметить, что технология OData поддерживает отношения между элементами с ее функцией "навигационные ссылки", но не существует вашей концепции вида ассоциации.

Надеюсь, это поможет тебе, Тьерри

Я не уверен, что здесь есть объективно "лучший" ответ. Существуют различные способы сделать это, следуя принципам REST. Сказав это, я бы предложил:

/{association_type}/{from_resource_id}/{to_resource_id}

или, если это недостаточно ясно, основываясь на типах ассоциации:

/association/{association_type}/{from_resource_id}/{to_resource_id}

РЕДАКТИРОВАТЬ:

Исходя из ваших комментариев, может быть, что-то вроде этого больше подходит:

/associations/from/{from_resource_id}/to/{to_resource_id}

а также:

/associations/to/{to_resource_id}

Это было бы самым явным. Опять же, я думаю, здесь много места для творчества. Многое зависит от того, ожидаете ли вы, что люди будут вводить их самостоятельно или создавать пути, а не извлекать их из других частей вашего API.

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