REST and GraphQL are two ways to get data from a server. They help your app talk to the backend and show information to users.
REST vs GraphQL awareness in Express
Start learning this pattern below
Jump into concepts and practice - no test required
/* REST example: Express GET endpoint */ app.get('/users/:id', (req, res) => { const userId = req.params.id; // fetch user by userId res.json(userData); }); /* GraphQL example: Single endpoint with query */ const { graphqlHTTP } = require('express-graphql'); const { buildSchema } = require('graphql'); const schema = buildSchema(` type Query { user(id: ID!): User } type User { id: ID name: String email: String } `); const root = { user: ({ id }) => { // fetch user by id } }; app.use('/graphql', graphqlHTTP({ schema: schema, rootValue: root, graphiql: true, }));
REST uses multiple URLs for different data types and actions.
GraphQL uses one URL and lets clients specify what data they want in a query.
/* REST: Get user by ID */ GET /users/123 /* REST: Get all users */ GET /users
/* GraphQL: Query user by ID */ { user(id: "123") { id name } }
/* REST: Update user email */ PUT /users/123 { "email": "new@example.com" }
/* GraphQL: Mutation to update user email */ mutation { updateUser(id: "123", email: "new@example.com") { id email } }
This program shows both REST and GraphQL ways to get user data by ID. You can try REST by visiting /users/1 or GraphQL by sending a query to /graphql.
const express = require('express'); const { graphqlHTTP } = require('express-graphql'); const { buildSchema } = require('graphql'); const app = express(); app.use(express.json()); // Sample data const users = [ { id: '1', name: 'Alice', email: 'alice@example.com' }, { id: '2', name: 'Bob', email: 'bob@example.com' } ]; // REST endpoint to get user by ID app.get('/users/:id', (req, res) => { const userId = req.params.id; const user = users.find(u => u.id === userId); if (user) { res.json(user); } else { res.status(404).json({ error: 'User not found' }); } }); // GraphQL schema const schema = buildSchema(` type User { id: ID name: String email: String } type Query { user(id: ID!): User } `); // Root resolver const root = { user: ({ id }) => users.find(u => u.id === id) }; // GraphQL endpoint app.use('/graphql', graphqlHTTP({ schema: schema, rootValue: root, graphiql: true })); // Start server app.listen(4000, () => { console.log('Server running on http://localhost:4000'); console.log('Try REST: GET http://localhost:4000/users/1'); console.log('Try GraphQL: http://localhost:4000/graphql'); });
REST is simple and works well for fixed data needs but can send extra data you don't want.
GraphQL lets clients ask for exactly what they need, reducing data transfer.
GraphQL requires learning query language and setting up a schema, which can be more complex.
REST uses multiple URLs and HTTP methods to get and change data.
GraphQL uses one URL and lets clients specify exactly what data they want.
Choose REST for simple APIs and GraphQL for flexible, efficient data fetching.
Practice
Solution
Step 1: Understand REST API structure
REST APIs use different URLs (endpoints) for different resources and HTTP methods like GET, POST, PUT, DELETE to perform actions.Step 2: Understand GraphQL API structure
GraphQL uses a single endpoint URL and clients specify exactly what data they want in the query, making it flexible.Final Answer:
REST uses multiple URLs and HTTP methods; GraphQL uses a single URL with flexible queries. -> Option AQuick Check:
REST vs GraphQL = multiple URLs vs single URL [OK]
- Thinking GraphQL uses multiple URLs like REST
- Confusing HTTP methods usage between REST and GraphQL
- Believing REST and GraphQL are the same
Solution
Step 1: Identify correct HTTP method for fetching data
GET method is used to retrieve data in REST APIs.Step 2: Check URL pattern for resource identification
/user/:id correctly uses a URL parameter to specify which user to fetch.Final Answer:
app.get('/user/:id', (req, res) => { /* fetch user */ }); -> Option CQuick Check:
GET + /user/:id = fetch user [OK]
- Using POST instead of GET for fetching data
- Using GraphQL endpoint for REST question
- Using PUT method which is for updates
{ user(id: "1") { name } }?
const { graphqlHTTP } = require('express-graphql');
const schema = buildSchema(`
type Query {
user(id: ID!): User
}
type User {
id: ID
name: String
email: String
}
`);
const root = {
user: ({ id }) => ({ id, name: 'Alice', email: 'alice@example.com' })
};
app.use('/graphql', graphqlHTTP({ schema, rootValue: root, graphiql: true }));Solution
Step 1: Understand the GraphQL query
The query requests only thenamefield of the user with id "1".Step 2: Check resolver returns full user object
The resolver returns id, name, and email, but GraphQL returns only requested fields.Final Answer:
{"data":{"user":{"name":"Alice"}}} -> Option BQuick Check:
GraphQL returns only requested fields [OK]
- Expecting all fields returned regardless of query
- Confusing error responses with valid data
- Assuming REST style full object return
app.get('/users/:id', (req, res) => {
const user = users.find(u => u.id === req.params.id);
if (user) {
res.json(user);
}
res.end();
});Solution
Step 1: Analyze response flow
If user is found, res.json(user) sends response, but code continues to res.end() which sends empty response again.Step 2: Understand Express response behavior
Calling res.end() after res.json() can cause the response to be overwritten or cause errors.Final Answer:
res.end() is called even after sending a response, causing empty output. -> Option DQuick Check:
Only send one response per request [OK]
- Using wrong HTTP method for fetching
- Assuming path name causes empty response
- Ignoring that res.end() can overwrite response
Solution
Step 1: Identify requirement for flexible fields and fewer endpoints
Clients want to specify fields and avoid many URLs.Step 2: Match approach to requirement
GraphQL uses one endpoint and allows clients to request exactly needed fields, fitting the requirement.Final Answer:
Use GraphQL with a single endpoint letting clients specify exactly which fields they want. -> Option AQuick Check:
Flexible fields + single endpoint = GraphQL [OK]
- Choosing REST and returning all fields wastes bandwidth
- Using GraphQL with multiple endpoints defeats its purpose
- Confusing REST flexibility with GraphQL's query power
