GraphQL

22

Transcript of GraphQL

GraphQLMartin Zlámal

GET   /i-ps/<pressure>/<enthropy>GET   /i-tp/<temperature>/<pressure>GET   /i-ts/<temperature>/<entropy>GET   /i-tv/<temperature>/<volume>GET   /i-vs/<volume>/<entropy>GET   /i-px/<pressure>/<vapor-quality>GET   /i-tx/<temperature>/<vapor-quality>  ...

{    "enthalpy": 3372}

REQUEST

RESPONSE

GET   /general/<temperature>/<pressure>

{    "enthalpy": 3372,    "entropy": 6.59,    "volume": 0.0324,    "vapor-quality": 1      ...}

REQUEST

RESPONSE

GraphQL funguje jinak...

POST   /graphql

{    physicalQuantity(        temperature: 550        pressure: 10    ) {        enthalpy    }}

{    "data": {        "physicalQuantity": {            "enthalpy": 3372        }    }}

REQUEST RESPONSE (JSON)

...včetně general endpointu

{    physicalQuantity(        temperature: 550        pressure: 10    ) {        enthalpy        entropy        volume        vaporQuality    }}

{    "data": {        "physicalQuantity": {            "enthalpy": 3372,            "entropy": 6.59,            "volume": 0.0324,            "vaporQuality": 1        }    }}

REQUEST RESPONSE (JSON)

{    physicalQuantity(        temperature: 5505        pressure: 10    ) {        enthalpy    }}

{    "data": {        "physicalQuantity": null    },    "errors": [{            "message": "Physics broken!"            "locations": [{                "line": 2,                "column": 2            }]    }]}

REQUEST

RESPONSE (JSON)

V případě chyby

http://graphql-swapi.parseapp.com/?query=%7B%0A%20%20allFilms%20%7B%0A%20%20%20%20films%20%7B%0A%20%20%20%20%20%20id%0A%20%20%20%20%20%20title%0A%20%20%20%20%20%20director%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20film(id%3A%20%22ZmlsbXM6Mg%3D%3D%22)%20%7B%0A%20%20%20%20id%0A%20%20%20%20title%0A%20%20%20%20created%0A%20%20%20%20director%0A%20%20%20%20planetConnection%20%7B%0A%20%20%20%20%20%20planets%20%7B%0A%

20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0A&operationName=null&variables=

DEMOTIME

{    alias: allPhysicalQuantities {        name    }}

REQUESTRESPONSE (JSON)

Jde to i bez parametrů...

{    "data": {        "alias": [            {"name": "enthalpy"},            {"name": "entropy"},            {"name": "vaporQuality"},            {"name": "temperature"},              ...        ]    }}

query ($pressure: Int!) {    physicalQuantity(        temperature: 550        pressure: $pressure    ) {        enthalpy    }}

REQUEST

REQUEST DATA

RESPONSE (JSON)

...nebo s parametry lépe

{    "data": {        "physicalQuantity": {            "enthalpy": 3372        }    }}

{ "pressure": 10 }

query {    allPhysicalQuantities {        ...quantityFields    }    quantity(type: "enthalpy") {        ...quantityFields    }}

fragment quantityFields on Quantity {    name}

REQUEST:

Fragmentace dotazů

{    allPhysicalQuantities(first:2, after:"base64cursor") {        name        base64cursor: cursor    }}

REQUEST

A co stránkování?Lze udělat celkem libovolně - jeden z příkladů:

Toto ale není dobře!Kurzor by neměl být součástí (typu) fyzikální veličiny

{    allPhysicalQuantities(first:2, after:"base64cursor") {        cursor        node {            name        }    }}

REQUEST

Stránkování 2/3

Vrátí se pole uzlů v grafu (obsahující jméno) apříslušné kurzory, takže je možné se na uzlyodkazovat

Kam ale dát informaci o počtu fyzikálních veličin?

{    allPhysicalQuantities(first:2, after:"base64cursor") {        totalCount        edges {            cursor            node {                name            }        }    }}

REQUEST

Edges FTW

Je dobrý nápad rovnou umožnit vytažení všech (vnašem případě) fyzikálních vlastnosti bez nutnostistránkovat.

V dotazu pak nebudou kurzory, hrany ani uzly grafu.

http://graphql-swapi.parseapp.com/?query=query(%24filmId%3A%20ID!%2C%20%24withPlanets%3A%20Boolean!)%20%7B%0A%20%20allFilms(first%3A%202%2C%20after%3A%20%22ZmlsbXM6Mg%3D%3D%22)%20%7B%0A%20%20%20%20totalCount%20%23%20Oh%20wow!%20This%20is%20comment!%0A%20%20%20%20pageInfo%20%7B%0A%20%20%20%20%20%20hasNextPage%0A%20%20%20%20%7D%0A%20%20%20%20alias%3A%20films%20%7B%0A%20%20%20%20%20%20...filmFields%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20filmAlias%3A%20film(id%3A%20%24filmId)%20%7B%0A%20%20%20%20...filmFields%0A%20%20%

7D%0A%7D%0A%0Afragment%20filmFields%20on%20Film%20%7B%0A%20%20idAlias%3A%20id%0A%20%20titleAlias%3A%

20title%0A%20%20created%0A%20%20director%0A%20%20planetConnection(first%3A%202)%20%40include(if%3A%20%24withPlanets)%20%7B%0A%20%20%20%20edges%20%7B%0A%20%20%20%20%20%20cursor%0A%20%20%20%20%20%20node%20%7B%0A%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20diameter%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0A&operationName=undefined&variables=%7B%0A%20

%20%22filmId%22%3A%20%22ZmlsbXM6Mg%3D%3D%22%2C%0A%20%20%22withPlanets%22%3A%20true%0A%7D

DEMOTIME

mutation ($username: String!, $password: String!) {    login(username: $username, password: $password) {        jwt: token    }}

{"data": {        "login": {            "token": "xxxxx.yyyyy.zzzzz"        }}}

REQUEST

Dotazy vs. Mutace

RESPONSE (JSON)

webonyx.github.io/graphql-php

github.com/adeira/connector

graphql.org/learn

facebook.github.io/graphql

A co Nette?

Moje doporučení:

Čtivá dokumentace:

Dokumentace pro J. Tvrdíka:

Referenční Nette projekt:

zlml.czJednou za čas kvalitní článek, třeba o GraphQL...

zlml.cz/2-graphql