GraphQL vs REST
Created : August 06, 2020
Learned from How to GraphQL official tutorial.
GraphQL is a query language for APIs, not databases.
GraphQL vs REST
-
REST
- stateless servers & structured access to resources
- too inflexible to keep up with the rapidly changing requirements of the clients that access them.
-
GraphQL
- more flexibility and efficiency
-
uses a strong type system to define the capabilities of an API.
- All the types are written down in a schema using the GraphQL Schema Definition Language (SDL).
- Schema serves as the contract between the client and the server to define how a client can access the data.
With REST
-
Gather the data by accessing multiple endpoints.
/users/<id>
: fetch the initial user data/users/<id>/posts
: fetch all the posts for a user/users/<id>/followers
: fetch a list of followers per user.
- Have to make 3 requests to different endpoints to fetch the required data.
-
Overfetching : Endpoints return additional information that’s not needed.
- Because the only way for a client to download data is by hitting endpoints that return fixed data structures.
-
Imagine for example : Need to display a list of users only with their names.
- Hit the
/users
endpoint and receive a JSON array with user data. - Response might contain more info about the users (e.g. birthdays or addresses), which is useless.
- Hit the
-
Underfetching and the n+1 problem : A specific endpoint doesn’t provide enough of the required information.
- The client will have to make additional requests to fetch everything it needs.
- This can escalate to a situation where a client needs to first download a list of elements, but then needs to make one additional request per element to fetch the required data.
-
e.g. To display the last three followers per user
- Make one request to the
/users
endpoint to get a list of users. - and then hit the
/users/<user-id>/followers
endpoint for each user.
- Make one request to the
With GraphQL
- Simply send a single query to the GraphQL server that includes the concrete data requirements.
-
Server responds with a JSON object where these requirements are met.
- structure of the server’s response follows precisely the nested structure defined in the query.