DEV Community

Rahul Vijayvergiya
Rahul Vijayvergiya

Posted on

Examples of REST, GraphQL, RPC, gRPC

This article will focus on practical examples of major API protocols: REST, GraphQL, RPC, gRPC. By examining these examples, you will gain a clearer understanding of how each protocol operates and how to implement them in your own projects.

If you haven't read the first article comparing REST, GraphQL, RPC, and gRPC, check it out here - Comparative Analysis: REST, GraphQL, RPC, gRPC

REST Example

This example demonstrates how to fetch a user's information using a GET request.

Endpoint: GET /users/{id}

Node.js Example:

const express = require('express');
const app = express();

app.get('/users/:id', (req, res) => {
  const userId = req.params.id;
  // Simulate fetching user from database
  const user = {
    id: userId,
    name: "John Doe",
    email: "john.doe@example.com"
  };
  res.json(user);
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});
Enter fullscreen mode Exit fullscreen mode

Request:

GET /users/123 HTTP/1.1
Host: localhost:3000
Enter fullscreen mode Exit fullscreen mode

Response:

{
  "id": 123,
  "name": "John Doe",
  "email": "john.doe@example.com"
}
Enter fullscreen mode Exit fullscreen mode

GraphQL Example

This example shows how to fetch a user's information using a GraphQL query.

Query:

{
  user(id: 123) {
    id
    name
    email
  }
}
Enter fullscreen mode Exit fullscreen mode

Node.js Example:

const { ApolloServer, gql } = require('apollo-server');

const typeDefs = gql`
  type User {
    id: ID!
    name: String!
    email: String!
  }

  type Query {
    user(id: ID!): User
  }
`;

const resolvers = {
  Query: {
    user: (_, { id }) => {
      return {
        id,
        name: "John Doe",
        email: "john.doe@example.com"
      };
    }
  }
};

const server = new ApolloServer({ typeDefs, resolvers });

server.listen().then(({ url }) => {
  console.log(`Server ready at ${url}`);
});
Enter fullscreen mode Exit fullscreen mode

Response:

{
  "data": {
    "user": {
      "id": 123,
      "name": "John Doe",
      "email": "john.doe@example.com"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

RPC Example

This example shows how to call a remote procedure to fetch user data.

Request:

{
  "method": "getUser",
  "params": [123],
  "id": 1,
  "jsonrpc": "2.0"
}
Enter fullscreen mode Exit fullscreen mode

Node.js Example:

const express = require('express');
const bodyParser = require('body-parser');
const app = express();

app.use(bodyParser.json());

app.post('/rpc', (req, res) => {
  const { method, params, id } = req.body;
  if (method === 'getUser') {
    const userId = params[0];
    const user = {
      id: userId,
      name: "John Doe",
      email: "john.doe@example.com"
    };
    res.json({
      result: user,
      id,
      jsonrpc: "2.0"
    });
  } else {
    res.status(400).json({ error: 'Unknown method' });
  }
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});
Enter fullscreen mode Exit fullscreen mode

Response:

{
  "result": {
    "id": 123,
    "name": "John Doe",
    "email": "john.doe@example.com"
  },
  "id": 1,
  "jsonrpc": "2.0"
}
Enter fullscreen mode Exit fullscreen mode

gRPC Example

This example shows a gRPC service definition and client call to fetch user data.

Protocol Buffer Definition:

syntax = "proto3";

service UserService {
  rpc GetUser (UserRequest) returns (UserResponse);
}

message UserRequest {
  int32 id = 1;
}

message UserResponse {
  int32 id = 1;
  string name = 2;
  string email = 3;
}
Enter fullscreen mode Exit fullscreen mode

Node.js Example:

const grpc = require('grpc');
const protoLoader = require('@grpc/proto-loader');
const packageDefinition = protoLoader.loadSync('user.proto', {});
const userProto = grpc.loadPackageDefinition(packageDefinition).user;

const server = new grpc.Server();
server.addService(userProto.UserService.service, {
  GetUser: (call, callback) => {
    const user = {
      id: call.request.id,
      name: "John Doe",
      email: "john.doe@example.com"
    };
    callback(null, user);
  }
});
server.bind('localhost:50051', grpc.ServerCredentials.createInsecure());
console.log('gRPC server running on port 50051');
server.start();
Enter fullscreen mode Exit fullscreen mode

Client Code:

const grpc = require('grpc');
const protoLoader = require('@grpc/proto-loader');
const packageDefinition = protoLoader.loadSync('user.proto', {});
const userProto = grpc.loadPackageDefinition(packageDefinition).user;

const client = new userProto.UserService('localhost:50051', grpc.credentials.createInsecure());

client.GetUser({ id: 123 }, (error, response) => {
  if (!error) {
    console.log('User:', response);
  } else {
    console.error(error);
  }
});
Enter fullscreen mode Exit fullscreen mode

Response:

{
  "id": 123,
  "name": "John Doe",
  "email": "john.doe@example.com"
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)