REST: связать ресурсы с зависимостью

Я пытаюсь создать отношения между двумя разными ресурсами с зависимостью. Сценарий:

Два ресурса, первый называется «аккаунт», а второй — «человек».

В моем API ресурс «человек» — это представление человека в реальном мире с именем, возрастом, полом, адресом, телефоном и т. д. Учетная запись — это ресурс, отвечающий за аутентификацию человека, например, логин.

Таким образом, представление ресурса «человек» выглядит следующим образом:

{
    "id": "7828292",
    "name": "Joseph Climber",
    "email": "[email protected]",
    "gender": "M",
    "telephones": {
        "main": {
            "number": "898987777"
        },
        "secondary": {
            "number": "909099090"
        },
        "business": {
            "number": "937363902"
        }
    },
    "address": {
         "rel": "address",
         "href": "person/{ID}/address"
     }
} 

А представление ресурса "account" выглядит так:

{
    "id": "[email protected]",
    "tokenAccess": "5E69FAE25F4B4F3E8CC5DE09A8163520",
    "link": {
         "rel": "person",
         "href": "person/{id}"
     }
}

Моя проблема: когда я создаю нового человека (человека POST), у меня нет способа аутентифицировать нового человека, в этом случае для этого необходимо создать новую учетную запись, поэтому это кажется немного запутанным для Потребители API, потому что API не выражает такого рода отношения естественным образом (базовая концепция хорошего дизайна API).

Как лучше всего представить эту зависимость между учетной записью и персональным ресурсом?


person Krock    schedule 01.07.2013    source источник
comment
Что вы подразумеваете под аутентификацией нового человека? Вы говорите о потребителе API?   -  person Botis    schedule 02.07.2013


Ответы (1)


Возможно, если кто-то попытается перейти от POST к /person без токена доступа, верните код состояния 401 Unauthorized с телом, например:

{
    "@type": "error",
    "description": "You must be authenticated to POST to person. If you do not have an account, then POST to /account to get an access token."
}

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

person theon    schedule 02.07.2013
comment
Привет, Теон, спасибо за ответ, но я думаю, что таким образом API все же запутался. Например, еще одна проблема, которая у меня есть: как я могу связать учетную запись с человеком (и наоборот), если процесс создания обоих отличается? - person Krock; 03.07.2013
comment
Не могли бы вы уточнить, что, по вашему мнению, сбивает с толку? Если бы я сделал вызов /person, который вернул бы сообщение об ошибке You must first call /account, я бы не нашел это запутанным — он точно говорит мне, что делать. Это потому, что пользователь не знает о зависимости заранее, прежде чем сделать вызов? Если да, возможно, вы что-то добавили в свою документацию по API. Swagger имеет раздел с произвольным текстом для каждого вызова API, где вы можете объяснить подобные вещи своим пользователям. . - person theon; 04.07.2013