È compatibile con GraphQL REST (quasi)?

1

Sto scrivendo un articolo su REST tradizionale vs GraphQL.

Tuttavia, dopo aver fatto alcune ricerche su REST (non solo su un'implementazione specifica di REST), ho iniziato a vedere che GraphQL in realtà si attiene alle stesse regole di REST, con 1 eccezione minore.

IMPORTANTE: sto parlando delle specifiche REST attuali. Non sto parlando solo di un'implementazione tradizionale di REST.

I principi REST sono descritti qui:

Questi sono:

  • Architettura del server client
  • apolidia
  • Cache
  • Sistema stratificato
  • Interfaccia uniforme
    • Identificazione delle risorse nelle richieste
    • Manipolazione delle risorse tramite le rappresentazioni
    • Messaggi di auto-descrizione
    • Hypermedia come motore dello stato dell'applicazione (HATEOAS)

GraphQL soddisfa banalmente i criteri di Client Server Architecture "," Statelessness "e" Layered System ".

È possibile realizzare un'implementazione GraphQL per soddisfare la cacheability , applicando che id è richiesto per ogni risorsa (si veda: link )

Che lascia " Uniform Interface ", che ha 4 sub-constraint:

Identificazione della risorsa nelle richieste

Individual resources are identified in requests.

GraphQL soddisfa Identificazione delle risorse nelle richieste , in quanto non vi è alcuna menzione che le risorse debbano essere nell'URL o nell'uso dei verbi HTTP.

Pertanto entrambi:

GET /books?fields=title

e

POST /graphQL
{
    books {
        id
        title
    }
}

sono conformi a REST.

Manipolazione delle risorse tramite rappresentazioni

When a client holds a representation of a resource, including any metadata attached, it has enough information to modify or delete the resource.

GraphQL può soddisfare questo, a condizione che l'attributo identificativo risorsa sia incluso per ogni richiesta. vale a dire il seguente non sarebbe valido:

{
    books {
        title
        author: {
            name
        }
    }
}

ma il seguente è valido:

{
    books {
        id
        title
        author: {
            id
            name
        }
    }
}  

Anche se direi che una buona API non dovrebbe restituire i dati di cui non abbiamo bisogno. Il cliente dovrebbe scegliere se desidera o meno l'ID, ma sto divagando.

Messaggi auto-descrittivi

Each message includes enough information to describe how to process the message. For example, which parser to invoke can be specified by a media type.

GraphQL soddisfa questo dato in quanto i dati restituiti sono JSON e il tipo di supporto è application/json .

Hypermedia come motore dello stato dell'applicazione (HATEOAS)

Having accessed an initial URI for the REST application—analogous to a human Web user accessing the home page of a website—a REST client should then be able to use server-provided links dynamically to discover all the available actions and resources it needs. As access proceeds, the server responds with text that includes hyperlinks to other actions that are currently available. There is no need for the client to be hard-coded with information regarding the structure or dynamics of the application.

GraphQL non soddisfa perfettamente HATEOAS , ma nemmeno molte altre API reali che dichiarano di essere RESTful.

Questo criterio è anche inutile quando si utilizza GraphQL, perché tutto viene eseguito su un singolo URI.

Tuttavia, vale la pena notare che GraphQL ha anche una funzione chiamata Introspection , che consente al client di ottenere informazioni su cosa interroga il supporto del server e la documentazione, che in un modo è più utile di un semplice URI.

Conclusione

Quindi, per concludere, sembra che GraphQL soddisfi:

  • Architettura del server client
  • apolidia
  • Sistema a strati
  • Identificazione delle risorse nelle richieste
  • Messaggi auto-descrittivi

Applicando che id è richiesto per ogni risorsa, può anche essere fatto per supportare:

  • Cache
  • Manipolazione delle risorse tramite rappresentazioni

E non ha davvero bisogno di supporto:

  • Hypermedia come motore dello stato dell'applicazione (HATEOAS), perché tutto viene eseguito su un URL e GraphQL ha introspezione.

Quindi possiamo concludere che GraphQL soddisfa REST, ad eccezione di HATEOAS (che IMO è comunque la parte peggiore di REST).

Sono corretto o ho frainteso le specifiche REST

link

    
posta Yahya Uddin 10.12.2018 - 00:34
fonte

1 risposta

2

No, GraphQL non è RESTful in alcun modo significativo.

Sì, se visualizzato isolatamente è possibile per sviluppare un'architettura RESTful che faccia uso di GraphQL. E in linea di principio, GraphQL è già memorizzabile nella cache anche quando non si introducono ID.

Ma come normalmente usato, GraphQL non è RESTful.

  • In particolare, GraphQL-over-HTTP di certo non fa uso di HTTP in modo RESTful, mentre le API RESTful “normali” non sono altro che HTTP usato in uno stile specifico.

  • Una differenza interessante è che una query GraphQL può toccare più risorse / oggetti in una query. Ciò non rende impossibile il caching, ma solo molto difficile. Ad esempio, non puoi sfruttare il caching HTTP ma devi eseguire il rollover.

  • GraphQL non ha nemmeno un concetto chiaro di risorsa. Invece, hai un grafico dell'oggetto. Non è sempre possibile dire dove finisce un oggetto e ne inizia un altro, a meno che non usiamo definizioni semplicistiche basate su oggetti JSON o sul sistema di tipi di GraphQL. Invece potremmo dire: in GraphQL, il grafico è l'unica risorsa.

  • Gli abbonamenti GraphQL si interrompono con la tipica query 1: 1: modello di risposta. Si potrebbe obiettare che questo si scontra con il principio di apolidia di REST poiché l'abbonato sarà avvisato quando lo stato del server cambia. In particolare, la presenza di un abbonamento è stato condiviso.

In sintesi, direi che GraphQL è quanto di più riposante come qualsiasi altro API basata su Web. Probabilmente non RESTful di default, ma può essere utilizzato in quello stile, se esplicitamente progettato in quel modo (possibilmente evitando determinate caratteristiche)

    
risposta data 10.12.2018 - 14:02
fonte

Leggi altre domande sui tag