jvc26
jvc26

Reputation: 6513

RESTful advice: default value for given resource

I have the following rest structure for 'keyboard' objects:

GET /keyboards/           -> Lists user keyboards
POST /keyboards/          -> Creates new keyboard
GET /keyboards/{id}       -> Get specific keyboard by id
PUT /keyboards/{id}       -> Update specific keyboard by id
DELETE /keyboards/{id}    -> Delete specific keyboard by id

The front end uses whatever keyboard is set to the users default keyboard, or, if the user has no custom keyboard set, simply returns a generic default.

At present, that is done by requesting another URL:

GET /keyboards/default

However, this appears a little misleading to me, as the resource 'default' could change whenever the user changes their default, and actually is a pointer to a different specific resource.

I'm not sure of a more elegant solution to this, as the front-end would appear to need to make two requests otherwise:

GET /keyboards/         -> Revealing the default
GET /keyboards/{id}     -> To get the mappings associated with the keyboard

Which seems a more laborious, two step process. Is the first option a reasonable one, or am I missing a more elegant implementation?

Upvotes: 1

Views: 1294

Answers (4)

Pedro Werneck
Pedro Werneck

Reputation: 41928

There's nothing wrong with having a convenience /keyboards/default identifier, as long as its cacheability is being defined correctly, which in this case would probably be to tell clients to not cache it at all.

Upvotes: 0

Pascal Le Merrer
Pascal Le Merrer

Reputation: 5981

Having to do a higher number of requests than with other architecture styles is a well-known and assumed drawback of RESTful APIs. It is counterbalanced by the fact responses may be cached more easily as each resource has a unique URL.

Upvotes: 2

bryanmac
bryanmac

Reputation: 39306

It's OK to have convenience identifiers like 'default', 'latest' etc...

GET /keyboards/default
-> {
       id: 3,

Another option is to hang the default keyboard off of a containing/referencing resource if there is one. For example

GET /computer
-> {
      name: foo,
      defaultKeyboard: 3,
      ...

If you want to avoid two requests you could have isDefault on the keyboard object.

GET /keyboards

[
  { id: 1, isDefault: false, ... }
  { id: 3, isDefault: true, ... }

That allows you to filter via querystring params.

Finally, this doesn't have to be an OR - you can have all of these for a convenient API for different access patterns.

Upvotes: 4

PeterB
PeterB

Reputation: 2034

Does you keyboard resource expose an "IsDefault" property? It should. And so:

GET /keyboards/

Would return a list of keyboards. You could examine the keyboard resources in the list and choose the one that is the default.

And you could also solve this by making this a query parameter:

GET /keyboards?IsDefault=true

Upvotes: 0

Related Questions