- declarative data fetching
- exposes single endpoint & responds to queries.
- No more over & underfetching.
- Rapid product iterations.
- Insightful Analytics.
- Benefits of Schema & Types.
{
"data": {
"User": "Mary",
"posts": [
{ "title": "Learn GraphQL today" },
{ "title": "React & GraphQL - A declarative love story" },
{ "title": "Why GraphQL is better than REST" },
{ "title": "Relay vs Apollo - GraphQL Clients" }
],
"followers": [
{ "name": "John" },
{ "name": "Alice" },
{ "name": "Sarah" }
]
}
}
// ! = required.
// associations are possible just like in SQL
// [] = list.
type Person {
id: ID!
name: String!
age: Int!
posts: [Post!]!
}
type Post {
title: String!
author: Person!
}
// allPersons(last: 2) // will only return the last 2 added to DB.
{
allPersons {
name
age
}
}
{
"allPersons": [
{ "name": "Johnny", "age": 23 },
{ "name": "Sarah", "age": 20 },
{ "name": "Alice", "age": 20 }
]
}
3 kinds of mutations
- Creating new data.
- Updating existing data.
- Deleting existing data.
mutation {
createPerson(name: "bob", age: 36) {
id // This is a unique id generated by the server.
name
age
}
}
{
"createPerson": {
"id": 123,
"name": "Bob",
"age": 36,
}
}
// This is a stream of data.
subscription {
newPerson {
name
age
}
}
{
"newPerson": {
"name": "Jane",
"age" 42
}
}
type Query {
allPersons(last: Int): [Person!]!
allPosts(last: Int): [Post!]!
}
type Mutation {
createPerson(name: String!, age: String!): Person!
updatePerson(id: ID!, name: String!, age: String!): Person!
deletePerson(id: ID!): Person!
createPost(title: String!): Post!
updatePost(id: ID!, title: String!): Post!
deletePost(id: ID!): Post!
}
type Subscription {
newPerson: Person!
updatedPerson: Person!
deletedPerson: Person!
newPost: Post!
updatedPost: Post!
deletedPost: Post!
}
- GraphQL server with a connected database. what I will be doing 😄
- GraphQL server to integrate existing system.
- A hybrid approach with a connected database and integration of existing system.
- GraphQL queries/mutations consist of set of fields.
- GraphQL server has one resolver function per field.
- The purpose of each resolver is to retrieve the data for its corresponding field.
query {
User(id: 'er3txsa9frju') {
name
friends(first: 5) {
name
age
}
}
}
User(id: String!): User
name(user: User!): String!
age(user: User!): Int!
friends(first: Int, user: User!): [User!]!