Apollo Client GraphQL with React
Published: 2022-04-22 18:23:29

In this article we gonna discuss about the basics about graphQL and how to use it in your react app.


### What is GraphQL ?
[GraphQL](https://graphql.org/) is a Query Language invented by facebook. It solves many of the shortcomings and inefficiencies while interacting with REST API.

It’s more flexible than REST APIs because it allows frontend clients to request exactly the data format the client needs. REST APIs on the other hand typically send back a fixed data format that often contains redundant data that is not required by the client, as example frontend client wants only user email, why I should call web API for a user and get all user information, and we will get an email, full name, age, etc… We only need an email attribute of the user.

In layman's term it is a query language acts as a filter between the data that is fetching and the data we actually get.(or) it is a syntax that describes how to ask for the data.

### Why GraphQL ?

##### You can extract the information you want

Traditionally you make the request to the server and you make use of the data you need but it can actually contain other properties that you may not need to the particular use case.

With GraphQL, users can query the data they are looking for. not less, not more.

##### Data Fetching

Lets say you have an users api and you want to fetch specific users's post and friends. For this scenario you want to make the endpoints like 

/users/:id/posts
/users/:id/friends

or you would get all the info from users/:id and you would use it. 

With GraphQL, you can specify with the one route (users/:id) and you can change your query according to your requirement.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zas3bxgs6z9cfm5wnn63.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fhpikonmi3dljz3s7tv5.png)

The first query will extract the posts and the later query will extract the friends

You can also specify the fields you want in your friends object as well


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c02fvfcklvrt42wpjcj3.png)


### Use Apollo Client with React

Apollo Client allows you to fetch data from your GraphQL server and use it in complex and reactive UIs.

You need to install apollo client and graphql package to get started.

```
npm install @apollo/client graphql --save
```

Now it needs to configure the _endpoint_ of your GraphQL API.

###### index.js

```
import React from 'react';
import ReactDOM from 'react-dom';

import App from './App';
import {ApolloClient, InMemoryCache, ApolloProvider} from '@apollo/client'

const client = new ApolloClient({
  uri : "https://rickandmortyapi.com/graphql/",
  cache: new InMemoryCache()
})


ReactDOM.render(  
  <ApolloProvider client={client}>
  <App />
  </ApolloProvider>
,document.getElementById('root'));

```

I am using rickandmorty api for this implementation.I've come across another api [crwnclothing](https://crwn-clothing.com/) and you can use this as well.

With the ApolloClient you have to provide _uri_. **InMemoryCache** is something acts like an actual cache thats gonna memoize the query we hit and everytime you hit the query it will search for the query in here.

You have to wrap your application with ApolloProvider at the top heirarchy of your app. So I did it in index.js

### Our First Query

Typically a query would look like an object that defines the fields we want. You can name the query if you want. The following screenshots would show how to query it in GraphiQL and their results. You can visit to [rickandmortyapi](https://rickandmortyapi.com/graphql) and try out the queries.


 
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tkvez2fubj2aromk49dm.png)


As I said you can extract the exact information you want. 


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dlmu9bglmswgscs5u0ln.png)


You need to import gql and useQuery from apollo/client

```
import {gql, useQuery} from '@apollo/client'
```

Define our Query


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uote1v0xriuya0ihb19m.png)


##### CharactersList.js

```
import React from 'react'
import {gql, useQuery} from '@apollo/client'

const GET_CHARACTERS = gql`
    query fetchAllCharacters {
    characters {
        results {	
         id
         name
        image
        }
    }
}
`

function CharactersList() {
    const {data, loading, error} = useQuery(GET_CHARACTERS);
    if(loading) {
        return <div> Loading...</div>
    }

    if(error){
        return <div>Error occured {error.message}</div>
    }  
    return (
    <div className='characters-list'>{data.characters.results.map((character) => {
        return <div>
            <img src={character.image} />
            <p>{character.name}</p>
        </div>
    })}</div>
  )
}

export default CharactersList
```

The output of this characters list would be like


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4m4g4fyhqharv2x3dew7.png)

useQuery is purely for GET request only. There is an another hook for useMutation which is for POST and PUT request.

If you want a single Character, you have to pass the Query with variables. The query would look like

```

const GET_CHARACTER_BY_ID = gql`
    query fetchCharacterById($id:ID!) {
        character(id : $id) {
            id
            name
            image
           
        }
    }
`

```

Here We have to specify what kind of parameter that we gonna pass. This specific ID data type gonna assign to the variable _id_ in the character query.

Now you have to wonder , how am gonna pass the id into this thing. Its very simple.

```
 const {data,loading,error} = useQuery(GET_CHARACTER_BY_ID, {variables : {id: 4}})
```

Here I pass _4_ as the harcoded value but in real scenario it would be a variable.

I hope this would be the best primer to get started with apollo client.Kudos. Happy Coding!