Я работаю над REST API
, и я пытаюсь понять, как обращаться с иерархическими ресурсами.
Фон
Начнем с простого примера. В моем API у меня есть Пользователи, Профили пользователей и Обзоры.
- Пользователи должны иметь профиль пользователя (профиль пользователя соответствует только одному пользователю)
- Пользователи могут иметь Обзор (обзор соответствует только одному пользователю)
Представление пользовательских ресурсов должно быть:
User: {
"u1": "u1value", // User attributes
"u2": "u2value",
...
"links": [{
"rel": "profile",
"href": "http://..." // URI of the profile resource
}, {
"rel": "review",
"href": "http://..." // URI of the review resource
}]
}
Представление ресурса профиля пользователя должно быть:
UserProfile: {
"p1": "p1value", // Profile attributes
"p2": "p2value",
...
"links": [{
"rel": "owner",
"href": "http://..." // URI of the user resource
}]
}
Просмотр представления ресурсов должен быть:
Review: {
"r1": "r1value", // Review attributes
"r2": "r2value",
...
"links": [{
"rel": "owner",
"href": "http://..." // URI of the user resource
}]
}
Ресурсы URI могут быть:
-
http://api.example.com/users/{userid}
: доступ к ресурсу пользователя -
http://api.example.com/users/{userid}/profile
: доступ к ресурсу пользовательского профиля -
http://api.example.com/users/{userid}/review
: доступ к ресурсу обзора пользователя
Создание ресурса: какой правильный способ создать пользователя?
Теперь я хочу создать нового пользователя:
-
POST http://api.example.com/users {"u1": "bar", "u2": "foo"}
и я возвращаю новый userid = 42 -
POST http://api.example.com/users/42/profile {"p1": "baz", "p2": "asd"}
-
PUT http://api.example.com/users {"u1": "bar", "u2": "foo", links: [{"rel": "profile", "href": "http://api.example.com/users/42/profile"]}
Мои проблемы:
- Что, если что-то перерывается между 1 и 2 или 2 и 3?
- В 3), должен ли сервер автоматически обновлять ссылки в http://api.example.com/users/42/profile, чтобы указать на правильного владельца?
- Обновление полей ссылок - это правильный способ создания отношений? Или я должен пропустить шаг 3), и пусть система угадывает отношения в соответствии с соглашениями URI? (Я читал в нескольких книгах, что URI следует считать непрозрачным.)