GraphQL

High level Overview
Starting point: REST
Frontend
Requests
Backend API
Resources
GET /users
GET /addresses
GET /orders
REST Limitations
Overfetching
Backend API
Frontend
GET /users

Requirement: Add a dropdown with all first names
<<Response>>
we just care about this
REST Limitations
Overfetching

Requirement: Add a dropdown with all first names
Select a User
Russel
Yasmeen
REST Limitations
Underfetching
Backend API
Frontend

Requirement: Create a list of users and their address
GET /users
<<Response>>
GET /addresses
<<Response>>

REST Limitations
Underfetching

Requirement: Create a list of users and their address

Russel Rogahn
03793 Jones Spring
Bethlehem, South Carolina
Â
Yasmeen Welch
862 Bogisich Shoal
Lucindashire, Nabraska
Â

GraphQL

Server Concern
Frontend Concern
GraphQL
Ask for what you want

GraphQL
HTTP
 RESTÂ
GraphQL
GET
POST
PUT
DELETE
POST
Russel Rogahn
03793 Jones Spring
Bethlehem, South Carolina
Â
Yasmeen Welch
862 Bogisich Shoal
Lucindashire, Nabraska
Â
GraphQL
Ask for what you want
POST /graphql
<<Response>>
Backend API
Frontend
query {
users {
firstName
lastName,
address {
street
city
state
}
}
}[
{
"firstName": "Russell",
"lastName": "Rogahn",
"address": {
"street": "03793 Jones Spring",
"city": "Bethlehem",
"state": "South Carolina"
}
},
{
"firstName": "Yasmeen",
"lastName": "Welch",
"address": {
"id": 4,
"street": "862 Bogisich Shoal",
"city": "Lucindashire",
"state": "Nebraska"
}
}
]
Russel Rogahn
03793 Jones Spring
Bethlehem, South Carolina
Â
Yasmeen Welch
862 Bogisich Shoal
Lucindashire, Nabraska
Â

Query:
Result:
Ask for what you want
GraphQL
Automatic documentation
GraphQL


Basic usage
Queries (GET)
Mutations (POST, PUT/PATCH, DELETE)
Subscriptions (Websockets)
Queries
Usage
<<Response>>
{
"data": {
"hero": {
"name": "R2-D2",
"friends": [
{
"name": "Luke Skywalker"
},
{
"name": "Han Solo"
},
{
"name": "Leia Organa"
}
]
}
}
}query {
hero {
name
friends {
name
}
}
}POST /graphql
Queries with arguments
Usage
<<Response>>
{
"data": {
"human": {
"name": "Luke Skywalker",
"height": 1.72
}
}
}query {
human(id: "1000") {
name
height
}
}POST /graphql
Queries with sub arguments
Usage
<<Response>>
{
"data": {
"human": {
"name": "Luke Skywalker",
"height": 5.6430448
}
}
}query {
human(id: "1000") {
name
height(unit: FOOT)
}
}POST /graphql
Mutations
Usage
<<Response>>
{
"data": {
"link": {
"id": "link-1",
"description": "Cool Website"
}
}
}mutation {
link(url: "www.popmenu.com", description: "Cool Website") {
id
description
}
}POST /graphql
Subscriptions
Usage
Backend API
Client 1
Client 2
Subscribe to Restaurant
Update Restaurant
Update Menu
Client 3
Subscribe to Restaurant
Update Restaurant
Subscribe to Menu
POST /graphql
mutation {
updateRestaurant() {
...
}
}POST /graphql
mutation {
updateMenu() {
...
}
}Demo Time

GraphQL Intro
By genuchelu
GraphQL Intro
- 234