Search code examples
restrestful-architecturejson-ldhypermediahydra-core

Master-detail representation in Json-LD


On forhand : sorry if I misunderstood hypermedia or Restfull concepts : it's a work in progress...)

I try to figure out hypermedia and hydra (http://www.markus-lanthaler.com/hydra), and have some questions about returning information to the client before designing my api.

say I have a webshop located at www.myshop.com

a HTTP GET to the root could return (for example) a list of resources represented as link (in a json-ld document):

...
"@id": "/api",
"products" : "www.myshop.com/api/products",
"customers":"www.myshop.com/api/customers"
...

First question on hydra, how could I add actions here ? it seems the client needs to load another document before the load of application. I mean the potential actions are not in the docuemnt retrieved from www.myshop.com/api Or do I miss something?


Then going further, I've stated that products is a hydra:Link so that the client could follow that link (interact with it) with a HTTP GET and retrieve a list of products. that will be a list like this :

....
{
  "@id": "/api/products/123",
  "@type": "vocab:Product"
},
{
  "@id": "/api/products/124",
  "@type": "vocab:Product"
},
....

here the client receives a list of product (That could be a paged collection). But if the client wants to display it to the user, let's say a table with [product Id, price, name] (not all Product's properties)

Second Question : How could I do that without the client sending a request to the server for each product, but still provide the link to get the product's detailed information,(or even here having four link : one for getting the detailed information, one for Delete and one for sharing it with a friend and a last one to add it to a Basket) ?

In fact I have difficulties to figure out how hydra is coming into play by not having Links in the document itself? I think that Hal uses this approach to having links in the document itself (if I am right) and I try to find how hydra does this link...

regards


Solution

  • A bit late but I'll nevertheless try to answer your questions Cedric.

    say I have a webshop located at www.myshop.com

    a HTTP GET to the root could return (for example) a list of resources represented as link (in a json-ld document):

     ... "@id": "/api",
     "products" : "www.myshop.com/api/products",
     "customers":"www.myshop.com/api/customers" ...
    

    First question on hydra, how could I add actions here ? it seems the client needs to load another document before the load of application. I mean the potential actions are not in the docuemnt retrieved from www.myshop.com/api Or do I miss something?

    You basically have two options here: 1) embed the operations directly in the response or 2) attach the operations to the properties (products, customers) instead.

    Approach 1) would look somewhat like this:

    ...
    "@id": "/api",
    "products" : {
      "@id": "http://www.myshop.com/api/products",
      "operation": {
        "@type": "Operation",
        "method": "POST",
        "expects": "Product"
      }
    }
    ...
    

    While approach 2) would attach the same operation to the products property in the referenced Hydra ApiDocumentation:

    ...
    "@id": "...products",
    "supportedOperation": {
      "@type": "Operation",
      "method": "POST",
      "expects": "Product"
    }
    ...
    

    Please note that in 1) I used operation while in 2) I used supportedOperation. Also, you should use a more specific type than Operation.

    Regarding your second question:

    with a HTTP GET and retrieve a list of products. that will be a list like this :

    ....
    {
      "@id": "/api/products/123",
      "@type": "vocab:Product"
    },
    {
      "@id": "/api/products/124",
      "@type": "vocab:Product"
    },
    ....
    

    here the client receives a list of product (That could be a paged collection). But if the client wants to display it to the user, let's say a table with [product Id, price, name] (not all Product's properties)

    Second Question: How could I do that without the client sending a request to the server for each product, but still provide the link to get the product's detailed information,(or even here having four link : one for getting the detailed information, one for Delete and one for sharing it with a friend and a last one to add it to a Basket) ?

    You can add as much information (including links) as you want directly in the collection.

    ....
    {
      "@id": "/api/products/123",
      "@type": "vocab:Product",
      "name": "Product 123",
      "price": "9.99"
    },
    {
      "@id": "/api/products/124",
      "@type": "vocab:Product",
      "name": "Product 124",
      "price": "19.99"
    },
    ....
    

    That way, a client only needs to dereference an item if the collection doesn't contain that required information.

    In fact I have difficulties to figure out how hydra is coming into play by not having Links in the document itself?

    Of course you do have links in the document as well. Links are just properties whose values happen to be URLs (objects with an @id property unless you set the property's type to @id in the context to get rid of that) instead of treating them specially.