KeihakuOh / GraphQL_React_App

0 stars 0 forks source link

graphQL vs restful routing #1

Open KeihakuOh opened 2 months ago

KeihakuOh commented 2 months ago

user/:id/:idのRESTful APIバックエンド設計

URLパターンの改良 /user/:userId/orders/:orderId 例: /user/123/orders/456は、ユーザーID 123のオーダーID 456を取得することを意味します。

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

app.use(express.json()); // JSONボディのパース

// ユーザー情報を取得する
app.get('/users/:userId', (req, res) => {
    const { userId } = req.params;
    // ユーザー情報をデータベースから取得して返す
    res.send(`ユーザーID: ${userId} の情報`);
});

// 特定のユーザーのオーダーを取得する
app.get('/users/:userId/orders/:orderId', (req, res) => {
    const { userId, orderId } = req.params;
    // データベースから注文情報を取得して返す
    res.send(`ユーザーID: ${userId} のオーダーID: ${orderId}`);
});

// 新しいオーダーを作成する
app.post('/users/:userId/orders', (req, res) => {
    const { userId } = req.params;
    const { orderData } = req.body;
    // オーダーをデータベースに作成
    res.send(`ユーザーID: ${userId} の新しいオーダーが作成されました`);
});

// オーダーを更新する
app.put('/users/:userId/orders/:orderId', (req, res) => {
    const { userId, orderId } = req.params;
    const { orderData } = req.body;
    // データベースでオーダーを更新
    res.send(`ユーザーID: ${userId} のオーダーID: ${orderId} が更新されました`);
});

// オーダーを削除する
app.delete('/users/:userId/orders/:orderId', (req, res) => {
    const { userId, orderId } = req.params;
    // データベースからオーダーを削除
    res.send(`ユーザーID: ${userId} のオーダーID: ${orderId} が削除されました`);
});

app.listen(3000, () => {
    console.log('サーバーがポート3000で起動中');
});

image

ーーーーーーーーー

GraphQLでは、リソースをURLで表現するのではなく、クエリ言語を使って必要なデータをクライアントが指定する方式です。1つのエンドポイント(通常は/graphql)に対してクエリを送るだけで、複数のリソースにアクセスできます。

//GraphQLのスキーマ例
type User {
  id: ID!
  name: String!
  orders: [Order]
}

type Order {
  id: ID!
  total: Float!
}

type Query {
  user(id: ID!): User
  users: [User]
  order(userId: ID!, orderId: ID!): Order
}
/GraphQLクエリの例
{
  user(id: "123") {
    name
    orders {
      id
      total
    }
  }
}
//このクエリを使うと、特定のユーザー(ID 123)の名前とそのユーザーに関連するすべてのオーダーのIDと合計金額を1つのリクエストで取得できます。
//GraphQLのバックエンド実装例(Node.js & Apollo Server)
const { ApolloServer, gql } = require('apollo-server');

// GraphQLのスキーマ
const typeDefs = gql`
  type User {
    id: ID!
    name: String!
    orders: [Order]
  }

  type Order {
    id: ID!
    total: Float!
  }

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

// サンプルデータ
const users = [
  { id: '123', name: 'John Doe', orders: [{ id: '1', total: 100.50 }, { id: '2', total: 200.00 }] },
  { id: '456', name: 'Jane Smith', orders: [{ id: '3', total: 300.75 }] },
];

// Resolver (データ取得のロジック)
const resolvers = {
  Query: {
    user: (parent, args) => users.find(user => user.id === args.id),
  },
  User: {
    orders: (parent) => parent.orders,
  },
};

// Apollo Serverの設定
const server = new ApolloServer({ typeDefs, resolvers });

server.listen().then(({ url }) => {
  console.log(`GraphQLサーバーが${url}で起動中`);
});
KeihakuOh commented 2 months ago

RESTful APIは、小規模なアプリケーションや、簡単なデータ構造を扱う場合に向いています。また、シンプルなリクエスト/レスポンスの流れが必要な場合に適しています。

GraphQLは、クライアントが柔軟にデータを取得したい場合や、複数のリソースに対する依存関係が複雑な場合に非常に強力です。リクエストの最適化が重要なアプリケーションや、リアルタイムデータを扱う場合に有効です。