GraphQL
-
Upload
martin-zlamal -
Category
Technology
-
view
208 -
download
5
Transcript of GraphQL
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