To keep things simple and to avoid nameing collisions, I've been bundling links in my record resources like this...
{
id: 211,
first_name: 'John',
last_name: 'Lock',
_links: [
{ rel: 'self', href: 'htttp://example.com/people/211' }
]
}
However, I can't work out how to implement links in collections. I have spent a long time trawling around the web for examples and other than using the not so lean HAL I'm unable to reconcile my problem.
[
{id:1,first_name:.....},
{id:2,first_name:.....},
{id:3,first_name:.....},
"_links": "Cant put a key value pair here because its an-array"
]
Which means I have to wrap up the array in a container object.
{
people: [ {id:1,first_name:.....} ],
links: [ { rel:parent, href:.... ]
}
But is is different to the singular resource so I'm going to make the record behave like the collection and wrap it up in a container....
{
person: {
id: 211,
first_name: 'John',
last_name: 'Lock'
},
links:[
{ rel: 'self', href: 'htttp://example.com/people/211' }
]
}
On the surface, this seems like quite a neat solution. The resulting JSON is one level deeper, but HATEOAS has been implemented, so that's all good right? Not at all. The real sting comes when I go back to the collection. Now that the single resource has been wrapped up in a container in order to be consistent with the collection, the collection must now be changed in order to reflect the changes. And this is where it gets ugly. Very ugly. Now the collection looks like this...
{
"people": [
{
"person": {
....
},
"links" : [
{
"rel": "self",
"href": "http://example.com/people/1"
}
]
},
{
"person": {
....
},
"links" : [
{
"rel": "self",
"href": "http://example.com/people/2"
}
]
}
],
"links" : [
{
"rel": "self",
"href": "http://example.com/people"
}
]
}
Is there a simpler solution to implementing HATEOAS for collections? Or should I kiss HATEOAS goodbye for forcing me to over complicate the data structure?
_links
and_embedded
attributes with an underscore? Is it part of some naming conventions? – Polyclinic