30分でできる!非エンジニアのためのAPI超入門:身近なサービスからWebの裏側まで
APIは異なるソフトウェア間の情報交換を可能にする技術であり、TypeScriptとNode.jsを使って30分でシンプルなAPIを構築する方法を紹介。基本的な概念からHTTPとREST APIの基礎、CRUD操作の実装までを学び、API開発の楽しさと可能性を体験できる内容です。
APIは異なるソフトウェア間の情報交換を可能にする技術であり、TypeScriptとNode.jsを使って30分でシンプルなAPIを構築する方法を紹介。基本的な概念からHTTPとREST APIの基礎、CRUD操作の実装までを学び、API開発の楽しさと可能性を体験できる内容です。
スマートフォンで天気予報をチェックしたり、地図アプリで目的地までのルートを検索したり、SNSで友人とコミュニケーションを取ったり。これら日々の生活を便利にしているサービスの裏側には、「API」という技術が深く関わっています。
APIは「Application Programming Interface」の略で、異なるソフトウェアやアプリケーション同士が情報をやり取りするための「窓口」や「仲介役」のようなものです。私たちは普段、意識せずともAPIの恩恵を受けています。
「APIを作る」と聞くと、なんだか難しそう、エンジニアだけがやるもの、と感じるかもしれません。しかし、APIを自分で作ってみることは、Webサービスがどのように動いているのかを深く理解する素晴らしい機会になります。そして、簡単なツールを自分で作れるようになるなど、あなたのデジタルライフをさらに豊かにする可能性を秘めているのです。
本記事では、プログラミングの知識が少ない方でも、TypeScriptとNode.jsを使ってわずか30分でシンプルなAPIを構築する体験を提供します。APIの基本的な概念から、Webの「会話」のルールであるHTTPとREST APIの基礎まで、手を動かしながら楽しく学んでいきましょう!
APIとは、異なるソフトウェアやアプリケーション同士が情報をやり取りするための「窓口」や「仲介役」のようなものです。この概念を理解するために、身近な例で考えてみましょう。
あなたがレストランでお腹を空かせているとします。あなたは直接キッチンに行って料理を作ることはできませんよね。そこで、あなたはウェイターを呼び、メニューを見て「〇〇をください」と注文します。
この時、
このように、ウェイター(API)があなたの注文(リクエスト)をキッチン(アプリケーションB)に伝え、キッチンが作った料理(レスポンス)をあなた(アプリケーションA)に届けてくれることで、あなたはキッチンの内部構造を知らなくても、美味しい料理(情報や機能)を受け取ることができます。
APIの基本的な役割は、「異なるシステム間の連携をスムーズにし、必要な情報や機能を安全に、効率的にやり取りできるようにすること」と理解しておけば大丈夫です。
APIを実際に作る前に、まずは開発環境を整えましょう。今回は、Web開発で広く使われている「Node.js」と、JavaScriptに型安全性を加える「TypeScript」を使います。
Node.jsは、JavaScriptをWebブラウザの外で実行するための環境です。npm(Node Package Manager)は、Node.jsのパッケージ(ライブラリやツール)を管理するためのツールで、Node.jsをインストールすると一緒についてきます。
以下の手順でインストールできます。
インストールが完了したら、コマンドプロンプト(Windows)またはターミナル(Mac/Linux)を開き、以下のコマンドを入力して、バージョンが表示されることを確認してください。
node -v npm -v
バージョンが表示されれば、インストールは成功です!
次に、APIを作るためのプロジェクトフォルダを作成し、TypeScriptを使えるように設定します。
my-first-apiという名前のフォルダを作成します。bash cd path/to/my-first-apipackage.jsonファイルを作成します。これは、プロジェクトの情報や使用するパッケージを管理するためのファイルです。質問はすべてEnterでスキップして大丈夫です。
bash npm init -ybash npm install -D typescript @types/node
Dは開発時のみ必要なパッケージであることを示します。@types/nodeは、Node.jsの機能(ファイル操作など)をTypeScriptで使うための「型定義ファイル」です。TypeScriptは型を重視するため、このようなファイルが必要になります。tsconfig.jsonファイルを作成します。これは、TypeScriptのコンパイル(TypeScriptのコードをJavaScriptに変換すること)に関する設定を行うファイルです。
bash npx tsc --init
npxは、インストールしたパッケージのコマンドを実行するためのツールです。これで、TypeScriptでAPIを開発するための基本的な準備が整いました。次のステップでは、実際にコードを書いてAPIを動かしてみましょう!
準備が整ったところで、いよいよAPIを構築していきます。今回は、Node.jsでWebアプリケーションやAPIを簡単に作るためのフレームワーク「Express.js」を使います。
まずはExpress.jsをプロジェクトにインストールしましょう。コマンドプロンプト/ターミナルで、プロジェクトフォルダ(my-first-api)にいることを確認して、以下のコマンドを実行します。
npm install express @types/express
expressがExpress.js本体です。@types/expressは、Express.jsをTypeScriptで使うための型定義ファイルです。プロジェクトフォルダの直下にsrcというフォルダを作成し、その中にindex.tsというファイルを作成してください。最終的なファイル構成は以下のようになります。
my-first-api/ ├── node_modules/ ├── src/ │ └── index.ts ├── package.json ├── package-lock.json └── tsconfig.json
そして、src/index.tsに以下のコードを記述してください。
import express from 'express'; // Expressアプリケーションを作成 const app = express(); const port = 3000; // APIが動作するポート番号 // ルート('/')へのGETリクエストに対する処理 app.get('/', (req, res) => { res.send('Hello, API!'); // 「Hello, API!」というテキストを返す }); // 指定したポートでサーバーを起動 app.listen(port, () => { console.log(`APIサーバーが http://localhost:${port} で起動しました`); });
import express from 'express';: Express.jsを使うための準備です。const app = express();: Expressアプリケーションの本体を作成しています。これがAPIの司令塔になります。const port = 3000;: APIが待ち受けるポート番号を設定しています。Webサイトでいう「住所」のようなものです。今回は3000番ポートを使います。app.get('/', (req, res) => { ... });: ここがAPIの「窓口」の設定です。
app.get()は、WebブラウザからURLにアクセスするような「情報を取得する(GET)」リクエストを受け付ける設定です。'/'は、APIの「パス」です。今回は「http://localhost:3000/」という一番シンプルなURLにアクセスしたときに動くように設定しています。(req, res) => { ... }は、リクエストが来たときに実行される処理です。reqはリクエストの情報、resはレスポンスを返すためのオブジェクトです。res.send('Hello, API!');は、クライアント(Webブラウザなど)に対して「Hello, API!」というテキストを返す、という指示です。app.listen(port, () => { ... });: これでAPIサーバーを起動します。指定したポート(今回は3000番)でリクエストを待ち受ける状態になります。サーバーが起動したら、コンソールにメッセージが表示されます。APIを起動するには、TypeScriptのコードをJavaScriptにコンパイルし、Node.jsで実行する必要があります。package.jsonに便利なスクリプトを追加しましょう。
package.jsonを開き、"scripts": { ... }の箇所を以下のように編集してください。
{ "name": "my-first-api", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "build": "tsc", "start": "node dist/index.js", "dev": "npm run build && npm run start" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "@types/node": "^20.x.x", "@types/express": "^4.x.x", "typescript": "^5.x.x" }, "dependencies": { "express": "^4.x.x" } }
"build": "tsc": TypeScriptのコードをJavaScriptにコンパイルするコマンドです。コンパイルされたJavaScriptファイルは、デフォルトでdistフォルダに作成されます。"start": "node dist/index.js": コンパイルされたJavaScriptファイルを実行するコマンドです。"dev": "npm run build && npm run start": buildコマンドを実行した後、startコマンドを実行する、という一連の流れをまとめて実行するコマンドです。これで準備は完了です!コマンドプロンプト/ターミナルで以下のコマンドを実行して、APIサーバーを起動しましょう。
npm run dev
以下のようなメッセージが表示されれば成功です。
APIサーバーが http://localhost:3000 で起動しました
APIサーバーが起動したら、以下の方法で動作を確認できます。
http://localhost:3000/と入力してEnterキーを押します。「Hello, API!」というテキストが表示されれば成功です。curlコマンドで確認: コマンドプロンプト/ターミナルをもう一つ開き、以下のコマンドを実行します。
bash curl http://localhost:3000/
「Hello, API!」というテキストが返ってくれば成功です。これで、あなたはTypeScriptとNode.js、Expressを使って、初めてのAPIを構築し、動作させることに成功しました!わずか30分で、Webの裏側で動くAPIの基本的な仕組みを体験できたはずです。
先ほど作成した「Hello, API!」を返すAPIは、非常にシンプルですが、Webの「会話」の基本的なルールであるHTTPとREST APIの概念を理解するのに役立ちます。
HTTP(Hypertext Transfer Protocol)は、WebブラウザとWebサーバーの間で情報をやり取りするための通信規約(プロトコル)です。あなたがWebサイトを閲覧する際、ブラウザはHTTPを使ってWebサーバーに「このページを見せてください」とリクエストを送り、サーバーはHTTPを使って「はい、どうぞ」とページの情報(HTML、画像など)をレスポンスとして返しています。
APIも、このHTTPという共通言語を使って情報のやり取りを行います。先ほどのAPIにhttp://localhost:3000/とアクセスした際、あなたのブラウザはAPIサーバーに対してHTTPのGETメソッドを使ってリクエストを送っていました。
HTTPには、情報のやり取りの方法を示すいくつかの「メソッド」があります。代表的なものは以下の通りです。
これらのメソッドを使い分けることで、Web上での様々な情報のやり取りが実現されています。
REST(Representational State Transfer)は、Webサービスを設計する上での「考え方」や「原則」のようなものです。RESTの原則に従って作られたAPIを「REST API」と呼びます。
REST APIの重要な原則の一つに「リソース指向」という考え方があります。これは、Web上のあらゆるものを「リソース」(資源)として捉え、そのリソースに対してHTTPメソッドを使って操作を行う、というものです。
例えば、商品情報を扱うAPIであれば、商品一つ一つが「リソース」となります。そして、
GET /products:全ての商品情報を取得GET /products/123:IDが123の商品情報を取得POST /products:新しい商品情報を作成PUT /products/123:IDが123の商品情報を更新DELETE /products/123:IDが123の商品情報を削除といった形で、URL(リソースの場所)とHTTPメソッド(操作の種類)を組み合わせることで、直感的にAPIの機能が理解できるよう設計されています。
先ほど作成したAPIは、http://localhost:3000/というルートパスにGETリクエストを送ると「Hello, API!」というテキストを返す、というシンプルなものでしたが、これも「/というリソースに対してGET操作を行う」というRESTの考え方に沿っています。
多くのモダンなWebサービスやアプリは、このREST APIの設計思想に基づいて構築されており、シンプルで分かりやすく、拡張性が高いというメリットがあります。
「Hello, API!」を返すだけのAPIは作れましたが、実際のAPIはもっと複雑なデータを扱います。ここでは、簡単な商品リストを管理するAPIを例に、データの作成(Create)、読み取り(Read)、更新(Update)、削除(Delete)という「CRUD」操作を実装してみましょう。データベースは使わず、APIサーバーが起動している間だけデータを保持する「インメモリ」で実装します。
まず、扱う商品データの「型」をTypeScriptで定義します。src/index.tsの先頭に以下のコードを追加してください。
interface Product { id: string; name: string; price: number; description?: string; // オプション(あってもなくても良い) } // 仮のデータストア(インメモリ) let products: Product[] = [ { id: '1', name: 'りんご', price: 150, description: '青森県産' }, { id: '2', name: 'みかん', price: 100, description: '愛媛県産' }, ];
interface Product: 商品が持つべき情報(id, name, price, description)とその型を定義しています。description?のように?をつけると、その項目は必須ではなくなります。let products: Product[] = [...]: Product型のオブジェクトを複数格納できる配列productsを定義し、初期データとして2つの商品を入れています。これが、今回のAPIの「データベース」の代わりになります。APIでデータを送受信する際には、JSON形式がよく使われます。ExpressでJSONデータを扱えるようにするために、以下の行をconst app = express();の直後に追加してください。
app.use(express.json()); // JSON形式のリクエストボディを解析するミドルウェア
app.get('/')の定義の下に、以下のエンドポイントを追加していきます。
// 全ての商品を取得 app.get('/products', (req, res) => { res.json(products); // products配列をJSON形式で返す });
res.json(products): res.send()の代わりにres.json()を使うことで、JavaScriptのオブジェクトを自動的にJSON形式に変換して返してくれます。// 特定の商品を取得 app.get('/products/:id', (req, res) => { const { id } = req.params; // URLのパスパラメータからidを取得 const product = products.find(p => p.id === id); // idに一致する商品を探す if (product) { res.json(product); } else { res.status(404).send('Product not found'); // 商品が見つからない場合は404エラーを返す } });
req.params: URLのパスに含まれる動的な値(例:/products/1の1)を取得できます。:idとすることで、idという名前で値を取得できます。products.find(): 配列の中から条件に合う要素を探すJavaScriptのメソッドです。res.status(404).send(): HTTPステータスコードを404(Not Found)に設定し、エラーメッセージを返しています。// 新しい商品を作成 app.post('/products', (req, res) => { const newProduct: Product = { id: String(products.length + 1), // 仮のIDを生成 ...req.body, // リクエストボディから商品情報を取得 }; products.push(newProduct); res.status(201).json(newProduct); // 作成された商品を201ステータス(Created)で返す });
req.body: クライアントから送られてきたJSONデータ(リクエストボディ)を取得できます。id: String(products.length + 1): 今回は簡易的に、現在の商品の数に1を足したものをIDとしています。実際にはUUIDなどユニークなIDを生成します。...req.body: スプレッド構文を使って、リクエストボディのプロパティをnewProductにコピーしています。res.status(201).json(): HTTPステータスコードを201(Created)に設定し、作成された商品を返しています。// 既存の商品を更新 app.put('/products/:id', (req, res) => { const { id } = req.params; const updatedProductData: Product = req.body; const index = products.findIndex(p => p.id === id); // idに一致する商品のインデックスを探す if (index !== -1) { products[index] = { ...products[index], ...updatedProductData, id }; // 既存の情報を上書き res.json(products[index]); } else { res.status(404).send('Product not found'); } });
products.findIndex(): 配列の中から条件に合う要素のインデックスを探すJavaScriptのメソッドです。index !== -1: findIndexは要素が見つからない場合1を返します。{ ...products[index], ...updatedProductData, id }: 既存の商品情報に、更新データと元のIDをマージして上書きしています。// 特定の商品を削除 app.delete('/products/:id', (req, res) => { const { id } = req.params; const initialLength = products.length; products = products.filter(p => p.id !== id); // idに一致しない商品だけを残す if (products.length < initialLength) { res.status(204).send(); // 削除成功時は204ステータス(No Content)を返す } else { res.status(404).send('Product not found'); } });
products.filter(): 配列から条件に合う要素を除外した新しい配列を作成します。res.status(204).send(): 削除が成功し、返すコンテンツがない場合に使うステータスコードです。APIサーバーを再起動(Ctrl+Cで停止し、再度npm run dev)した後、PostmanやInsomniaといったAPIテストツール、またはcurlコマンドを使って動作を確認してみましょう。
例: curlコマンドでの動作確認
bash curl http://localhost:3000/productsbash curl -X POST -H "Content-Type: application/json" -d '{"name":"バナナ","price":200,"description":"フィリピン産"}' http://localhost:3000/productsbash curl http://localhost:3000/products/1bash curl -X PUT -H "Content-Type: application/json" -d '{"price":180}' http://localhost:3000/products/1bash curl -X DELETE http://localhost:3000/products/1
何も返ってきませんが、ステータスコード204が返っていれば成功です。再度GET /productsで確認すると、商品が減っているはずですこれで、あなたは簡単なデータ管理機能を持つAPIをTypeScriptとExpressで構築できました!
今回、あなたはTypeScriptとNode.js、Expressを使って、シンプルなAPIを構築する体験をしました。これは、Webサービスの裏側で何が起きているのかを理解するための第一歩です。APIは、今後も私たちの生活やビジネスにおいて、その重要性を増していくでしょう。
AI(人工知能)やIoT(モノのインターネット)の進化に伴い、様々なデバイスやサービスがAPIを通じて連携し、より高度でパーソナライズされた体験が提供されるようになります。例えば、スマートスピーカーがあなたの好みを学習し、APIを通じて最適な音楽を再生したり、スマート家電があなたの生活パターンを把握し、APIを通じて自動で最適な環境を整えたりする未来が、すでに現実のものとなりつつあります。
ビジネスにおいても、APIエコノミーと呼ばれる、APIを通じて企業間でサービスやデータを連携し、新たな価値を創造する動きが加速しています。APIは、単なる技術的なインターフェースではなく、ビジネスを成長させ、社会をより豊かにするための重要な基盤となっているのです。
今回作成したAPIは非常にシンプルですが、ここからさらに発展させるためのヒントをいくつかご紹介します。
joiやclass-validatorなどのライブラリが役立ちます。API開発の世界は奥深く、学ぶことはたくさんありますが、今回の体験がその第一歩となることを願っています。TypeScriptとNode.jsは、Web開発の現場で非常に需要が高く、習得することであなたのキャリアの可能性を大きく広げることができるでしょう。
本記事では、APIの基本的な概念から、TypeScriptとNode.js、Expressを使ったAPIの構築方法、そしてHTTPとREST APIの基礎までを解説しました。
「APIを作る」という体験は、Webサービスがどのように動いているのか、データがどのようにやり取りされているのかを、より深く理解するための貴重な一歩です。プログラミングの経験が少ない方でも、わずか30分でシンプルなAPIを動かすことができたのではないでしょうか。
API開発の世界は広大ですが、今回の体験を通じて、その楽しさや可能性を感じていただけたなら幸いです。ぜひ、この一歩をきっかけに、さらにWeb開発の世界を探求してみてください。あなたのアイデアを形にするための強力なツールとして、API開発のスキルが役立つことを願っています。