# Introduction to GraphQL

## Query language

[GraphQL](https://www.graphql.org/) is a query language for API's. It's query language can pull multiple objects of different types, with less queries that would be needed using REST.

Where else is GraphQL used? Facebook, GitHub

#### What does GraphQL do?

REST API's follow a concept of [architectural constraints](https://en.wikipedia.org/wiki/Representational_state_transfer#Architectural_constraints). The classic API is multiple endpoints for various resources alongside `GET`, `POST,` `PUT` and `DELETE`.

GraphQL on the other hand usually has *one* endpoint, always `GET` or `POST`. The magic is in the query passed in the post data.

Assume the following:

```graphql
{
    institution {
        name
    }
}
```

Response:

```javascript
{
  "data": {
    "institution": {
      "name": "Happy University"
    }
  }
}
```

A couple things:

* The query to a single endpoint, via `GET` (`?query=...`) or `POST` (via `POST` data)
* The response is JSON
* The response structure matches the query

What's more is, GraphQL schemas enforce a structured, typed API, and provides instrumentation. This can best be put into example by seeing GraphiQL - a client for graphql - with the query above:

![](https://2518674650-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M3GmK_EkZyQQJhTJyLh%2F-MRzwe9S5r77_rrSuWij%2F-MRzwnCjnc1JBGbXtl1R%2Fgraphql-objects-and-types.gif?alt=media\&token=69a72706-25c3-445d-a2e5-a3ec9f8e3cda)

## Core concepts

#### Queries and Mutations:

* Query: Usually reading
* Mutation: Usually create, updating or deleting

#### Basics

* [Fields](https://graphql.org/learn/queries/#fields)
* [Type system](https://graphql.org/learn/schema/#object-types-and-fields):
  * [Object types](https://graphql.org/learn/schema/#object-types-and-fields)
  * [Enums](https://graphql.org/learn/schema/#the-query-and-mutation-types)
  * [Lists](https://graphql.org/learn/schema/#lists-and-non-null)
  * [Interfaces](https://graphql.org/learn/schema/#interfaces)

#### Advanced

* [Variables](https://graphql.org/learn/queries/#variables): Optional parametrization
* [Fragments](https://graphql.org/learn/queries/#fragments): Repeatable pieces of query
* [Pagination](https://graphql.org/learn/pagination/): Traverse through lists of data
