HATEOAS collega con i parametri definiti dal cliente, come rappresentare?

3

Mi chiedo come sia meglio modellare in un link API basato su HATEOAS che consenta al client di impostare i parametri. Per esempio. immagina una risposta alla ricerca che restituisca un elenco di prodotti e quindi i perfezionamenti che possono essere eseguiti su di loro:

{
    "results" : {
        ...
    }
    "refinements" : {
        "Size" : {
            "links" : {
               "extra small" : "/products?size=xs",
               "medium" : "/products?size=m"
            }
        }, 
        Price : {
            links: {
                "greater than" : "/products?priceGreaterThan=aValue",
                "less than" : "/products?priceLesshan=aValue",
                "between" : "/products?priceLesshan=aValue&priceGreaterThan=aValue"
            }
        }
    }
}

I perfezionamenti delle dimensioni sembrano diretti ma i perfezionamenti dei prezzi richiedono al cliente di passare un valore. In che modo questo è tipicamente rappresentato in un collegamento HATEOAS?

    
posta Sutty1000 14.05.2018 - 19:24
fonte

3 risposte

5

Consiglio vivamente che, quando si utilizza hypermedia, si usi un tipo di supporto abilitato per i media. Esistono molti tipi di media basati su JSON che supportano le interazioni di tipo formale.

Ecco un esempio che utilizza JSON Hyper-Schema. Si comporta proprio come un modulo HTML con method="get" .

/ prodotto

HTTP/1.1 200 OK
Content-Type: application/json
Link: </schema/product-list>; rel="describedby"

{
  results: [ ... ]
}

/ schema / prodotto-list

HTTP/1.1 200 OK
Content-Type: application/schema+json

{
  "$schema": "http://json-schema.org/draft-04/hyper-schema#",
  "links" : [
    {
      "rel": "search",
      "href": "/products",
      "schema": {
        "type": "object",
        "properties": {
          "size": { "enum": ["xs", "m"] },
          "priceGreaterThan": { "type": "number" },
          "priceLessThan": { "type": "number" }
        }
      }
    }
  ]
}

Un client generico può creare tutti i collegamenti dal tuo esempio e altro con questo schema. Altri esempi di tipi di media con funzionalità simili sono Siren, Hydra e, naturalmente, HTML.

    
risposta data 15.05.2018 - 07:42
fonte
2

La tua intenzione di odiare (oas) questa risposta, ma la mia interpretazione dell'idea originale sarebbe:

<form method="get" action="products">
    <input type="number" name="priceGreaterThan"/>
    <input type="submit"/>
</form>

Hai fornito tutte le informazioni interpretabili su cosa passare e come passarlo in formato Hypermedia.

In effetti, prima di ottenere un milione di voti in meno, lasciami un po 'di me stesso con alcune citazioni di Roy Fielding:

A truly RESTful API looks like hypertext.

e

Think of it in terms of the Web. How many Web browsers are aware of the distinction between an online-banking resource and a Wiki resource? None of them. They don’t need to be aware of the resource types. What they need to be aware of is the potential state transitions — the links and forms — and what semantics/actions are implied by traversing those links.

e

the media type tells the client either what method to use (e.g., anchor implies GET) or how to determine the method to use (e.g., form element says to look in method attribute).

    
risposta data 14.05.2018 - 19:58
fonte
2

Oltre a quelli menzionati da Jason, Collection + JSON s Modelli di query potrebbero essere una buona scelta anche se non sono un grande fan della sua verbosità.

Forse in modo più elegante, HAL utilizza templatesURI per descrivere i collegamenti con parametri:

{
    "_links": {

        "ea:find": {
            "href": "/orders{?id}",
            "templated": true
        }
    }
}
    
risposta data 15.05.2018 - 15:08
fonte

Leggi altre domande sui tag