Pracuję nad REST API
i staram się zrozumieć, jak radzić sobie z zasobami hierarchicznymi.Uaktualnianie/tworzenie zasobów hierarchicznych REST
Tło
Zacznijmy od prostego przykładu. W moim API mam użytkowników, Profile użytkowników i Recenzje.
- Użytkownicy musi mieć profil użytkownika związany (a profil użytkownika odpowiada tylko jeden użytkownik)
- Użytkownicy może mieć Przegląd związany (a weryfikacja odpowiada tylko jeden użytkownik) reprezentacja
użytkownika zasób powinien być:
User: {
"u1": "u1value", // User's attributes
"u2": "u2value",
...
"links": [{
"rel": "profile",
"href": "http://..." // URI of the profile resource
}, {
"rel": "review",
"href": "http://..." // URI of the review resource
}]
}
Profil użytkownika reprezentacja zasobów powinno być: reprezentacja
UserProfile: {
"p1": "p1value", // Profile attributes
"p2": "p2value",
...
"links": [{
"rel": "owner",
"href": "http://..." // URI of the user resource
}]
}
weryfikacja zasobów powinno być:
Review: {
"r1": "r1value", // Review attributes
"r2": "r2value",
...
"links": [{
"rel": "owner",
"href": "http://..." // URI of the user resource
}]
}
Resources URI mogą być:
http://api.example.com/users/{userid}
: dostęp do zasobu użytkownikahttp://api.example.com/users/{userid}/profile
: dostęp do zasobu profil użytkownikahttp://api.example.com/users/{userid}/review
: dostęp do przeglądu zasobu użytkownika
tworzenie zasobu: jaki jest właściwy sposób utworzyć użytkownika?
Teraz chcę utworzyć nowego użytkownika:
POST http://api.example.com/users {"u1": "bar", "u2": "foo"}
i wrócę nowy userid = 42POST 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"]}
Moje obawy:
- Co jeśli coś dzieli się między 1 a 2 lub 2 i 3?
- W 3), czy serwer powinien zaktualizować automatycznie linki w http://api.example.com/users/42/profile, aby wskazać właściwego właściciela?
- Aktualizowanie pól linków jest właściwym sposobem tworzenia relacji? Czy powinienem pominąć krok 3) i pozwolić systemowi odgadnąć relacje zgodnie z konwencjami URI? (Czytałem w kilku książkach, że URI należy uznać za nieprzejrzysty.)
jaki jest powód oddzielania obiektów dla użytkownika i profilu, ponieważ wydają się mieć obowiązkową relację 1 do 1? – njzk2