Please don’t dismiss HAL so quickly just because it looks a little bloated (in its JSON form, it’s quite minimal).
HAL is to JSON what HTML is to plain text.
It adds hyperlinks. You need hyperlinks and a commonly understood representation format (such as HAL or Collection+JSON) for REST. You also need HATEOAS for REST, without HATEOAS it isn’t REST! HATEOAS requires hyperlinks of course.
In your case, you are trying to build a collection resource. The IANA-registered relation for that is “item” (with reverse relation “collection”). Here is the representation in HAL for a People collection:
{
"_links": {
"self": { "href": "http://example.com/people" },
"item": [
{ "href": "http://example.com/people/1", "title": "John Smith" },
{ "href": "http://example.com/people/2", "title": "Jane Smith" }
]
},
"_embedded": {
"http://example.com/rels#person": [
{
"first_name": "John",
"last_name": "Smith",
"_links": {
"self": { "href": "http://example.com/people/1" },
"http://example.com/rels#spouse": { "href": "http://example.com/people/2" }
}
},
{
"first_name": "Jane",
"last_name": "Smith",
"_links": {
"self": { "href": "http://example.com/people/2" },
"http://example.com/rels#spouse": { "href": "http://example.com/people/1" }
}
}
]
}
}
Note:
-
The primary data for this collection comes from
_links.item[]. These are the items in the collection. The full (or at least some additional) data for each item is available in the_embeddedarray. If the client needs these additional data, it must find them by searching through_embedded[n]._links.self.hreffor eachn. This is a design constraint of HAL. Other hypermedia representation formats have similar constraints (though perhaps going in the other direction). -
I have added a
titlevalue for each member of theitemarray. This can appear between the opening and closing anchor tags if rendering to HTML, or as the text of a menu item in the client, without need for further processing of the representation by the client. -
There are no ID parameters. All references to other resources are exposed as hyperlinks. A client should not have to “build” a URL by gluing an ID into a URL at some pre-defined place. This constitutes out-of-band information which inhibits independent changes to the client and server.
-
All of your hyperlinks should be absolute, since relative URLs may cause problems. All of your relations should be either listed on that IANA page or use a URI to define them. Ideally, that URI should be a dereferencable HTTP URL with documentation about the relation at the other end.