Kodokon kodokon.com

REST APIを構築する

適切なHTTPメソッド、適切なステータスコード、そしてリクエストボディの検証を用いて、きれいなREST APIを設計しましょう。

9 分 · 3 問

このレッスンを Kodokon で開く

REST APIは、HTTPメソッドで操作されるリソース(ユーザー、タスク、注文)を公開します。GETで読み取り、POSTで作成、PUTまたはPATCHで更新、DELETEで削除します。プロの慣習では、URLには複数形の名詞を使い、動詞は決して使いません。/createTaskではなくPOST /tasksと書きます。まずはメモリ上で動く小さなタスクAPIを作ってみましょう。

JAVASCRIPT
import express from "express";

const app = express();
app.use(express.json());

const tasks = [
  { id: 1, title: "Review the module", done: false }
];

app.get("/tasks", (req, res) => {
  res.json(tasks);
});

app.listen(3000);

app.use(express.json())という行は欠かせません。これがないと、あらゆるJSONリクエストでreq.bodyundefinedになります。作成時には、必ず入力を検証し、201で応答し、作成したリソースを返しましょう。こうすることで、クライアントはサーバーが生成したidを取得できます。

JAVASCRIPT
app.post("/tasks", (req, res) => {
  const { title } = req.body;
  if (!title) {
    return res.status(400).json({
      error: "The title field is required"
    });
  }
  const task = {
    id: tasks.length + 1,
    title,
    done: false
  };
  tasks.push(task);
  res.status(201).json(task);
});

毎日使うことになるコードを覚えておきましょう。200は読み取りや更新の成功、201はリソースの作成、204は内容のない成功(削除)、400は無効なリクエスト、404はリソースが見つからない、500はサーバーエラーです。ルールはこうです。4xxならクライアントが間違えた、5xxならあなたのコードが失敗した、ということです。

JAVASCRIPT
app.delete("/tasks/:id", (req, res) => {
  const id = Number(req.params.id);
  const index = tasks.findIndex((t) => t.id === id);
  if (index === -1) {
    return res.status(404).json({
      error: "Task not found"
    });
  }
  tasks.splice(index, 1);
  res.status(204).end();
});

理解度チェック

このレッスンの要点をしっかり覚えているか確認しましょう。

  1. リソースの作成に成功したあと、どのステータスコードを返しますか?
    • 200
    • 201
    • 204
    • 301
  2. どの行がないと、JSONリクエストでreq.bodyundefinedのままになりますか?
    • app.use(express.json())
    • app.use(express.static(...))
    • app.listen(3000)
  3. クライアントが必須のtitleフィールドなしでPOSTを送ってきました。APIの正しい反応はどれですか?
    • 空のtitleでリソースを作成する
    • エラーメッセージとともに400ステータスを返す
    • 500ステータスを返す
    • 応答せずにリクエストを無視する