Perché i servizi RESTful che implementano HATEOAS forniscono un collegamento di auto-relazione?

4

Sto imparando su HATEOAS e ho notato che ogni implementazione sembra sempre implementare prima una relazione personale. Ad esempio un oggetto di risposta comune potrebbe apparire come

{
  title: "The Wonderful Wizard of Oz",
  author: "L. Frank Baum"
  links: [
    {
      rel: "self",
      href: "www.foo.com/book/1234"
    },
    {
      rel: "author",
      href: "www.foo.com/author/4321"
    }
  ]
}

Perché la relazione self è sempre presente? Sembra assolutamente inutile per me. Come cliente che ha appena effettuato la richiesta di ottenere l'oggetto risposta, ovviamente conoscerei l'URL per ottenere l'oggetto. Perché è presentato?

    
posta David Grinberg 20.06.2017 - 06:05
fonte

3 risposte

5

Il collegamento self viene utilizzato anche per le entità incorporate in cui può essere utilizzato per navigare verso l'entità corretta. Vedi questo esempio HAL:

{
    "_links": {
        "self": { "href": "/orders" },
        "curies": [{ "name": "ea", "href": "http://example.com/docs/rels/{rel}", "templated": true }],
        "next": { "href": "/orders?page=2" },
        "ea:find": {
            "href": "/orders{?id}",
            "templated": true
        },
        "ea:admin": [{
            "href": "/admins/2",
            "title": "Fred"
        }, {
            "href": "/admins/5",
            "title": "Kate"
        }]
    },
    "currentlyProcessing": 14,
    "shippedToday": 20,
    "_embedded": {
        "ea:order": [{
            "_links": {
                "self": { "href": "/orders/123" },
                "ea:basket": { "href": "/baskets/98712" },
                "ea:customer": { "href": "/customers/7809" }
            },
            "total": 30.00,
            "currency": "USD",
            "status": "shipped"
        }, {
            "_links": {
                "self": { "href": "/orders/124" },
                "ea:basket": { "href": "/baskets/97213" },
                "ea:customer": { "href": "/customers/12369" }
            },
            "total": 20.00,
            "currency": "USD",
            "status": "processing"
        }]
    }
}

L'unica motivazione che potrei pensare per avere collegamenti in se stessi con le entità di primo livello è che se si inserisce il servizio su qualche entità arbitraria, il collegamento personale fornisce informazioni sul proprio contesto nel servizio. Nell'esempio sopra riportato se qualcuno mi ha dato un link a http://example.com/myservice/special/dev/2017/admins/2 , il collegamento di auto relativo alla root di servizio ( /admins/2 ) sarebbe utile per trovare la radice del servizio e capire che probabilmente ci sono più amministratori, ecc.

    
risposta data 20.06.2017 - 06:22
fonte
0

In aggiunta alla risposta di Samuel, i collegamenti personali esistono anche nelle raccolte aggregate. Avrebbe senso dal mio punto di vista per la raccolta aggregata di comporsi utilizzando la stessa logica che fa un'entità individuale, per tutte le entità nella collezione. Quindi, se una risorsa foo chiama showFoo quando è richiesto un singolo foo , showAllFoos chiamerà internamente showFoo per ogni foo . Non ha molto senso aggiungere più logica per rimuovere il collegamento automatico quando viene richiesta una sola entità all'interno di showFoo .

Inoltre, un suggerimento più generale sulla creazione di punti di integrazione è seguire il principio di minimo stupore . Se il tuo servizio individuabile intende pubblicizzare un elenco di tutti gli endpoint di una risorsa, deve contenere un elenco di tutti degli endpoint per tale risorsa quando viene richiesto e non tutti gli endpoint che alcuni sviluppatori pensavano avessero effettivamente bisogno di .

Entrambe queste ragioni sono più in sintonia con i principi generali di sviluppo del software e non sono specifiche per la progettazione REST.

    
risposta data 20.06.2017 - 17:08
fonte
0

Why is the self relationship always there? It seems utterly useless to me. As a client who just made the request to get the response object I would obviously know the URL to get the object. Why is it presented?

Poiché l'identificatore utilizzato per ottenere la rappresentazione corrente potrebbe non essere l'identificatore preferito .

Il registro delle relazioni dei collegamenti cita RFC 4287 come il riferimento per la relazione di collegamento" self ". In RFC 4287, troverai:

Sezione 4.1.1

atom:feed elements SHOULD contain one atom:link element with a rel attribute value of "self". This is the preferred URI for retrieving Atom Feed Documents representing this Atom feed.

Sezione 4.2.7.2

The value "self" signifies that the IRI in the value of the href attribute identifies a resource equivalent to the containing element.

    
risposta data 20.06.2017 - 19:26
fonte

Leggi altre domande sui tag