はい、承知いたしました。初心者の方に向けて、REST APIの基本を徹底的に、詳細かつ分かりやすく解説する約5000語の記事を作成します。
REST APIとは?初心者向けに基本を徹底解説
インターネットを通じて、様々なアプリケーションやサービスが連携し、私たちの生活を豊かにしています。スマートフォンのアプリで天気予報を確認したり、オンラインショッピングで商品を検索したり、SNSで友人と繋がったり。これら多くの便利な機能の裏側には、「API(Application Programming Interface)」と呼ばれる仕組みが存在します。
そして、数あるAPIの中でも、現代のWebサービス開発において最も一般的で広く利用されているのが「REST API」です。
「API」「REST」「RESTful」…これらの言葉を耳にしたことはあっても、「具体的にどういうものなの?」「なぜ重要視されているの?」「どうやって使うの?」といった疑問を持っている方も多いのではないでしょうか。
この記事は、まさにそんな初心者の方のために書かれています。専門用語は避けつつ、もし使う場合は丁寧に解説しながら、REST APIの基本から、その仕組み、使い方、そしてなぜこれほどまでに普及したのかを、徹底的に分かりやすく解説していきます。
この記事を読めば、あなたはREST APIの概念をしっかりと理解し、現代のWebサービスの仕組みの核心に触れることができるでしょう。さあ、一緒にREST APIの世界への第一歩を踏み出しましょう。
第1章:APIとは何か? 〜 プログラム同士のお約束 〜
まず、「API」とは何か、という最も基本的な部分から始めましょう。APIは「Application Programming Interface」の略称です。
「Application(アプリケーション)」とは、私たちが使う様々なソフトウェアやサービスのことです。Webブラウザ、スマートフォンアプリ、サーバー上で動くプログラム、OSなど、全てアプリケーションと言えます。
「Programming(プログラミング)」は、コンピューターに指示を出す行為です。
「Interface(インターフェース)」とは、「接点」や「境界」を意味します。人間とコンピューターのインターフェースと言えば、キーボードやマウス、画面などがあります。プログラムとプログラムのインターフェースとは、プログラム同士が互いにやり取りするための「窓口」や「規約」のことです。
つまり、APIとは、「あるアプリケーションが、別のアプリケーションに対して、自分の持つ機能やデータの一部を安全に、そして決められた方法で提供するための窓口や、その利用方法に関するお約束事の集まり」と言えます。
1.1 APIの例え話
APIを理解するための一般的な例え話をいくつか紹介します。
-
例え話1:レストランでの注文
あなたはレストランでお腹が空きました。メニューを見て、食べたい料理を決めます。ウェイターを呼び、注文を伝えます。ウェイターはあなたの注文を厨房に伝え、料理人はその注文に従って料理を作ります。完成した料理はウェイターを通じてあなたの元に運ばれてきます。- あなた(お客さん): 機能を使いたいアプリケーション。
- 厨房(キッチン): 機能やデータを持っているアプリケーション(サービス提供者)。
- メニュー: 厨房が提供できる料理(機能やデータ)の一覧。
- ウェイター: あなたと厨房の間を取り持つ役割(API)。ウェイターは、あなたがメニューを見て、厨房が理解できる言葉で注文を伝え、厨房からの結果(料理)を持ってきてくれます。あなたは厨房の中の詳しい調理法を知る必要はありません。ウェイターというインターフェースを通じて、厨房の機能(料理)を利用できるのです。
-
例え話2:図書館での本の貸し出し
あなたは図書館で本を借りたいです。蔵書検索システムや司書に借りたい本の情報を伝えます。司書は図書館のルールに従って、本を探し、貸出手続きを行います。あなたは図書館の膨大な蔵書がどのように管理されているか、どこにどの本があるかの詳細を知る必要はありません。司書やシステムというインターフェースを通じて、図書館の機能(本の貸し出し)を利用できます。- あなた(利用者): 機能を使いたいアプリケーション。
- 図書館(蔵書管理システム): 機能やデータを持っているアプリケーション(サービス提供者)。
- 蔵書検索システム/司書: あなたと図書館の間を取り持つ役割(API)。本の探し方や貸し出しのルール(利用方法)が決まっています。
-
例え話3:家電製品のプラグとコンセント
様々なメーカーのテレビや電子レンジも、日本の家庭ならどのコンセントにも差し込むことができます。これは、コンセントの形状や電圧といった「インターフェース」が日本国内で統一されている(JIS規格など)ためです。- 家電製品(テレビ、電子レンジ): 機能を使いたいアプリケーション。
- 電力網: 機能やデータを持っているアプリケーション(サービス提供者)。
- プラグとコンセント: アプリケーションと電力網の間を取り持つ役割(API)。形状や電圧(利用方法)が決まっています。家電製品は電力網の発電方法や送電方法の詳細は知る必要がありません。
これらの例え話からわかるように、APIの重要な役割は以下の点にあります。
- 機能の提供: サービス提供者が持つ特定の機能(データ取得、処理実行など)を外部に提供できる。
- 抽象化とカプセル化: サービスの内部構造や複雑な処理の詳細を隠し、利用者は「どのように」ではなく「何を」したいかを伝えればよい。内部の変更があっても、APIの仕様が変わらなければ利用者は影響を受けにくい。
- 連携と再利用: 異なるアプリケーションやサービスが互いに連携し、既存の機能を組み合わせて新しいサービスを作りやすくなる。
- セキュリティと管理: どの機能やデータへのアクセスを許可するかをAPIで制御し、安全に公開できる。
1.2 APIの種類
APIと一言で言っても、様々な種類があります。
- ライブラリ/フレームワークのAPI: プログラミング言語や開発環境が提供するAPIです。例えば、Javaでファイル操作をする際の
java.ioパッケージや、Pythonで数学計算をする際のmathモジュールなどがこれにあたります。これはアプリケーション内部、または同じコンピューター上でのプログラム連携に使われます。 - OSのAPI: オペレーティングシステム(Windows, macOS, Linux, iOS, Androidなど)が提供するAPIです。アプリケーションはOSのAPIを使って、ファイルシステムへのアクセス、ネットワーク通信、ウィンドウ表示などのOS機能を利用します。
- Web API: インターネットを通じて、異なるサーバー上で動くアプリケーション間でデータをやり取りするためのAPIです。これが、この記事で主に扱う対象です。
この記事で解説するREST APIは、この「Web API」の一種であり、最も主要な形式の一つです。
第2章:Web APIとHTTP 〜 インターネット上での会話 〜
REST APIを理解するためには、Web APIがどのように動作するのか、そしてその基盤となっている技術である「HTTP」についても知る必要があります。
Web APIは、主にインターネット上のサーバーとクライアント(Webブラウザやスマートフォンアプリなど)の間でデータのやり取りを行います。このやり取りの「言葉」として最もよく使われるのが、HTTP (Hypertext Transfer Protocol) という通信規約です。
あなたがWebブラウザでウェブサイトを見るとき、例えば https://www.example.com/index.html というURLにアクセスします。このとき、ブラウザはサーバーに対して「このページの情報をください」という「リクエスト」を送信しています。サーバーはそれを受け取り、要求されたページの情報を「レスポンス」としてブラウザに返します。ブラウザはそのレスポンスに含まれる情報を解釈して画面に表示します。
Web APIもこれと同じHTTPの仕組みを使います。異なるのは、やり取りするデータが、人間が見るためのHTMLページだけでなく、プログラムが処理しやすい形式(後述するJSONやXMLなど)であることが多いという点です。
2.1 クライアントとサーバー
Web APIにおける基本的な構成要素は「クライアント」と「サーバー」です。
- クライアント (Client): サービスを利用する側です。Webブラウザ、スマートフォンアプリ、他のサーバー上で動くプログラムなどがクライアントになり得ます。「〇〇のデータが欲しい」「△△の処理を実行してほしい」といった「リクエスト」を送信します。
- サーバー (Server): サービスを提供する側です。機能やデータを持っており、クライアントからのリクエストを受け付け、要求された処理を実行したりデータを提供したりして「レスポンス」を返します。
APIは、このクライアントとサーバー間の通信の「窓口」であり、「規約」なのです。
2.2 HTTPリクエストとレスポンス
HTTP通信は、「リクエスト」と「レスポンス」というペアで成り立ちます。
-
HTTPリクエスト (HTTP Request): クライアントがサーバーに送るメッセージです。「〇〇してください」というお願い事や問い合わせです。リクエストには以下の情報が含まれます。
- メソッド (Method): サーバーに「何をしたいか」を伝えます。「データを取得したい」「新しいデータを作成したい」「既存のデータを更新したい」「データを削除したい」など、操作の種類を示します。代表的なものにGET, POST, PUT, DELETEなどがあります(これらはREST APIの重要な要素です!)。
- URI (Uniform Resource Identifier): サーバー上の「何に対して」操作を行いたいかを示します。URL (Uniform Resource Locator) はURIの一種で、リソースの場所を示します。Web APIでは、このURIを使って操作対象となる「リソース」(後述)を特定します。例:
/users/123は「IDが123のユーザー」というリソースを指し示すURIかもしれません。 - ヘッダー (Headers): リクエストに関する追加情報です。クライアントの種類(ブラウザの種類など)、受け付け可能なデータの形式、認証情報などが含まれます。
- ボディ (Body): リクエストの本体です。POSTやPUTリクエストなど、サーバーにデータを送信する場合に、そのデータ(例えば、新しく作成したいユーザーの情報など)を格納します。
-
HTTPレスポンス (HTTP Response): サーバーがクライアントに返すメッセージです。「リクエストの結果どうなったか」を伝えます。レスポンスには以下の情報が含まれます。
- ステータスコード (Status Code): リクエストが成功したか、失敗したか、その他の状態を3桁の数字で示します。例:
200 OK(成功)、404 Not Found(リソースが見つからない)、500 Internal Server Error(サーバー内部エラー)など。 - ヘッダー (Headers): レスポンスに関する追加情報です。サーバーの種類、データの種類、キャッシュに関する情報などが含まれます。
- ボディ (Body): レスポンスの本体です。GETリクエストへの応答であれば要求されたデータ(例:ユーザー情報)、POSTリクエストへの応答であれば作成結果の情報などが格納されます。
- ステータスコード (Status Code): リクエストが成功したか、失敗したか、その他の状態を3桁の数字で示します。例:
Web APIは、このHTTPのリクエストとレスポンスの仕組みを使い、サーバーとクライアントが決められた形式でデータを交換することで機能を実現しています。
第3章:RESTとは何か? 〜 Webの設計思想 〜
さて、いよいよ「REST」です。RESTは「Representational State Transfer」の略称です。これは特定の技術や規格の名前ではなく、Webサービスの設計思想、あるいはアーキテクチャスタイルです。
RESTは、ロイ・フィールディング氏が2000年に自身の博士論文で提唱したもので、当時すでに存在していたWebのアーキテクチャ(WWWの仕組み)を分析し、その成功の要因となった設計原則を形式的にまとめたものです。つまり、RESTは「Webがなぜこれほどまでに柔軟で拡張性があり、スケールできるのか?」という問いに対する答えであり、その原則に従って設計されたWebサービスは、Web本来の利点を活かせると考えられているのです。
「Representational State Transfer」という名前は少し難解ですが、簡単に言うと、「リソース(情報源)を、その表現(データ形式)を使ってやり取りすることで、アプリケーションの状態を遷移させる」という考え方です。
3.1 RESTの6つのアーキテクチャ原則
RESTfulなシステムと見なされるためには、通常以下の6つのアーキテクチャ原則に従っている必要があります。これらの原則は、Webが成功した理由を反映しており、柔軟性、スケーラビリティ、シンプルさ、信頼性などをシステムにもたらします。
-
Client-Server (クライアント・サーバー)
- 原則: クライアントとサーバーは互いに独立しているべきです。クライアントはユーザーインターフェースやユーザーの状態を管理し、サーバーはデータやビジネスロジックを管理します。
- なぜ重要か: これにより、クライアント側とサーバー側を独立して開発・更新・スケーリングできます。例えば、サーバー側のデータベースを変更しても、API仕様が変わらなければクライアント側は影響を受けません。また、様々なクライアント(Webブラウザ、iOSアプリ、Androidアプリなど)が同じサーバー側のAPIを利用できます。
- 例: Webブラウザ(クライアント)がウェブサーバー(サーバー)からウェブページを取得する。スマートフォンアプリ(クライアント)がAPIサーバー(サーバー)からユーザーデータを取得する。
-
Stateless (ステートレス)
- 原則: サーバーは、各クライアントのリクエストに関する「状態」(セッション情報など)を保持しないべきです。各リクエストは、それを処理するために必要なすべての情報(認証情報、操作対象のリソースなど)をそれ自体で完結して含んでいる必要があります。
- なぜ重要か: ステートレスであることで、サーバーはどのクライアントからのリクエストも独立して処理できます。これにより、サーバーを容易にスケールアウト(サーバー台数を増やすこと)できます。リクエストごとにどのサーバーが処理しても同じ結果が得られるため、負荷分散が容易になります。また、サーバー障害が発生しても、状態がサーバーに残らないため、他のサーバーがリクエストを引き継ぎやすくなります。
- 例: レストランの例えで言うと、ウェイターがあなたの注文を「覚えておく」のではなく、注文ごとにあなた自身が「〇〇をください、私は〇〇という名前で、〇〇番のテーブルです」と全ての情報を伝えるイメージです(実際はここまで冗長ではありませんが、概念として)。Webショッピングサイトで、ユーザーがカートに商品を入れた状態(ステート)をサーバー側だけで管理せず、クッキーやトークンなどをクライアントが毎回リクエストに含めることで状態を間接的に扱う、といった形で実現されます。
-
Cacheable (キャッシュ可能)
- 原則: クライアントからのレスポンスは、それがキャッシュ可能であるか不可能であるかをサーバーが明示する必要があります。クライアントはキャッシュ可能なレスポンスを再利用して、ネットワークのやり取りを減らすことができます。
- なぜ重要か: クライアントや途中のネットワーク機器(プロキシサーバーなど)がレスポンスをキャッシュすることで、同じリソースへの繰り返しアクセス時にサーバーへのリクエストを省略したり、レスポンス取得時間を短縮したりできます。これにより、システムのパフォーマンスとスケーラビリティが向上します。
- 例: Webブラウザがウェブサイトの画像やCSSファイルをキャッシュするのと同じように、APIレスポンスもキャッシュできます。サーバーはHTTPヘッダー(例:
Cache-Control,Expires,ETag)を使って、クライアントにそのレスポンスをどれくらいの期間キャッシュして良いか、または内容が更新されたかどうかを伝えます。
-
Layered System (階層化システム)
- 原則: クライアントは、自分が直接接続しているサーバーの先に、別のサーバー(ロードバランサー、プロキシ、レガシーシステムへのゲートウェイなど)が存在するかどうかを知る必要はありません。クライアントは単一のインターフェースを通じてシステム全体とやり取りします。
- なぜ重要か: これにより、システム構成を柔軟に変更できます。例えば、間にキャッシュサーバーを挟んだり、セキュリティゲートウェイを追加したりしても、クライアントは影響を受けずに済みます。システムの保守性、スケーラビリティ、セキュリティが向上します。
-
Code-On-Demand (コード・オン・デマンド) – ※これはオプションの原則です
- 原則: サーバーは、クライアントに実行可能なコード(例えばJavaScript)を送信することができます。これにより、クライアントの機能を一時的に拡張できます。
- なぜ重要か: クライアント側にあらかじめ組み込まれていない機能を提供できます。WebブラウザでJavaScriptがダウンロードされて実行されるのが典型的な例です。ただし、REST API自体は通常、データのみをやり取りするため、この原則はREST APIの必須要件とは見なされません。ほとんどのRESTfulなシステムはこの原則を満たしていません。
-
Uniform Interface (統一インターフェース)
- 原則: システム全体を通して、クライアントとサーバー間のインターフェースは統一されているべきです。これはRESTの最も重要かつ中心的な原則であり、以下の4つの制約(サブ原則)によって成り立っています。
- a) Identification of resources (リソースの識別): すべての情報は「リソース」として抽象化され、各リソースはURIによって一意に識別可能であるべきです。クライアントはURIを見るだけで、操作対象が何かを理解できるべきです。
- b) Manipulation of resources through representations (表現を通じたリソースの操作): クライアントは、リソースの「表現」(例えば、JSONやXML形式のデータ)を受け取ることで、そのリソースの状態を理解し、その表現を変更してサーバーに送信することでリソースの状態を変更できるべきです。例えば、ユーザー情報のJSONを受け取り、名前を変更したJSONをPUTリクエストで送信することで、ユーザーリソースの名前を更新します。
- c) Self-descriptive messages (自己記述的なメッセージ): クライアントとサーバー間の各メッセージ(リクエスト、レスポンス)は、それがどのように処理されるべきかについて十分な情報(HTTPメソッド、ヘッダー、メディアタイプなど)をそれ自体で含んでいるべきです。これにより、クライアントはメッセージを受信するだけで、どのようなデータ形式で、どのように扱えば良いかを理解できます。
- d) Hypermedia as the Engine of Application State (HATEOAS – アプリケーション状態のエンジンとしてのハイパーメディア): サーバーからのレスポンスには、関連するリソースへのリンク(ハイパーリンク)を含めるべきです。クライアントはこれらのリンクを辿ることで、アプリケーションの状態を遷移させることができます。例えば、ユーザー情報の取得レスポンスに、そのユーザーが投稿した記事一覧へのリンクや、ユーザー情報を編集するためのリンクを含める、といった形です。これにより、クライアントはAPIの利用方法をあらかじめすべて知っている必要がなく、サーバーからの情報に基づいて動的にAPIを探索・利用できるようになります。これはRESTfulの最も難しい、かつ純粋なRESTと「RESTful」を区別する重要な原則ですが、実際の多くの「RESTful API」はこのHATEOAS原則を完全に実装していません。
- 原則: システム全体を通して、クライアントとサーバー間のインターフェースは統一されているべきです。これはRESTの最も重要かつ中心的な原則であり、以下の4つの制約(サブ原則)によって成り立っています。
3.2 RESTful APIとは?
RESTの原則、特に「統一インターフェース」を含む上記の原則に従って設計されたWeb APIを「RESTful API」と呼びます。
しかし、前述の通り、特にHATEOASの原則は完全に実装するのが難しいため、多くの「RESTful API」は、Client-Server, Stateless, Cacheable, Layered Systemの原則と、Uniform Interface原則のうち「リソースの識別」「表現による操作」「自己記述的なメッセージ」の3つを守っていることが多いです。HATEOASは部分的に、あるいは全く実装されていないこともあります。
したがって、一般的に「REST API」や「RESTful API」と言うときは、これらの原則を(程度の差こそあれ)守っているWeb APIを指します。
第4章:REST APIの構成要素と実践
REST APIがどのような設計思想に基づいているかを見てきました。ここでは、実際にREST APIがどのように構成され、どのように利用されるのかを、より具体的に見ていきましょう。
REST APIを理解する上で鍵となるのは以下の要素です。
- リソース (Resource)
- URI (Uniform Resource Identifier)
- HTTPメソッド (HTTP Methods)
- 表現 (Representation)
- ステータスコード (Status Codes)
4.1 リソース (Resource)
RESTにおいて、操作の対象となるあらゆる情報やオブジェクトは「リソース」として扱われます。リソースは、概念的なものでも具体的なものでも構いません。
例:
- ユーザー情報
- 商品情報
- 注文
- 記事
- 写真
- サービス全体の状態
リソースは「名詞」で表現されるべきです。例えば、「ユーザーを作成する」という操作は、操作そのもの(動詞)ではなく、「ユーザー」というリソースに対して行われる操作として考えます。
4.2 URI (Uniform Resource Identifier)
各リソースは、URIによって一意に識別されます。URIはリソースの「名前」や「場所」を示すものです。Web APIでは、URIのパス部分を使ってリソースの階層構造を表すことが多いです。
URIの例:
/users: ユーザー「全体」というリソース、またはユーザーの「集合」/users/123: IDが123の「特定のユーザー」というリソース/products: 商品「全体」というリソース、または商品の「集合」/products/A100: IDがA100の「特定の商品」というリソース/users/123/orders: IDが123のユーザーの「注文の集合」というリソース
URIはリソースを特定するためのものであり、操作内容を示すものではありません。操作内容は次に説明するHTTPメソッドで指定します。
URI設計のベストプラクティスとしては以下のようなものがあります。
- 名詞を使う: URIはリソース(名詞)を識別するものなので、パス部分には名詞の複数形を使うのが一般的です(例:
/users,/products)。 - 階層構造: リソース間の関係をURIの階層で表す(例:
/users/123/orders)。 - シンプルな構造: URIは分かりやすく、推測しやすい構造にする。
- 小文字を使う: 大文字・小文字を区別すると混乱を招くため、小文字で統一する。
- 末尾のスラッシュ: コレクション(集合)を示すURIの末尾にスラッシュを付けるか付けないかは統一する(
/users/vs/users)。一般的には付けないスタイルが多いです。 - ハイフンを使う: 単語の区切りにはハイフン(
-)を使い、アンダースコア(_)は避けるのが一般的です。 - クエリパラメータ: フィルタリング、ソート、ページネーションなど、リソースの特定の「ビュー」を取得したい場合に、URIの末尾に
?を付けてからkey=valueの形式で指定します(例:/users?status=active&sort=created_at&limit=10)。これは特定の「リソース」を指すのではなく、リソースの「集合」に対する条件を示します。
4.3 HTTPメソッド (HTTP Methods)
リソースに対して「何をしたいか」を指示するのがHTTPメソッドです。RESTful APIでは、主に以下の標準的なHTTPメソッドを使用します。これらのメソッドは、リソースに対するCRUD操作(Create:作成, Read:読み取り, Update:更新, Delete:削除)に対応付けられることが多いです。
-
GET:
- 目的: 特定のリソース、またはリソースの集合を取得(読み取り)します。
- 特徴:
- リクエストボディは通常含みません。
- サーバー上のデータを変更しません(「安全」なメソッドと呼ばれます)。
- 同じリクエストを何度実行しても同じ結果が得られます(「べき等」なメソッドと呼ばれます)。
- キャッシュ可能です。
- 例:
GET /users: 全ユーザーのリストを取得GET /users/123: IDが123のユーザー情報を取得GET /products?category=books: カテゴリが本の商品のリストを取得
-
POST:
- 目的: 新しいリソースを作成します。または、特定のリソースに対して何らかの処理を実行します(例えば、フォームデータの送信、ファイルのアップロードなど)。
- 特徴:
- リクエストボディに作成するリソースの情報や処理に必要なデータを含めます。
- サーバー上のデータを変更します。
- 通常、何度実行しても異なる結果が得られます(「安全」でも「べき等」でもありません)。同じPOSTリクエストを複数回送信すると、複数のリソースが作成される可能性があります。
- キャッシュできません。
- 例:
POST /users: 新しいユーザーを作成(リクエストボディにユーザー情報を含める)POST /products/A100/reviews: 商品A100に対する新しいレビューを作成(リクエストボディにレビュー内容を含める)POST /orders: 新しい注文を作成
-
PUT:
- 目的: 特定のリソースを「完全に」更新します。指定されたURIにリソースが存在しない場合は、新しく作成することもあります(ただし、これはあまり一般的ではなく、通常は更新に使われます)。
- 特徴:
- リクエストボディに、更新後のリソースの完全な情報を含めます。
- サーバー上のデータを変更します。
- 同じリクエストを何度実行しても同じ結果が得られます(「べき等」なメソッドです)。例えば、ユーザー情報を更新するPUTリクエストを2回送っても、ユーザーは1人しか存在せず、その情報も1回目と2回目で同じ情報に更新されるだけです。
- キャッシュできません。
- 例:
PUT /users/123: IDが123のユーザー情報を、リクエストボディに含まれる情報で完全に置き換えて更新する
-
DELETE:
- 目的: 特定のリソースを削除します。
- 特徴:
- リクエストボディは通常含みません。
- サーバー上のデータを変更します。
- 同じリクエストを複数回実行しても、初回で削除が成功すれば2回目以降は「リソースが見つからない(404 Not Found)」や「すでに削除済み(204 No Content)」といった結果になるため、「べき等」と見なされることが多いです(ただし、サーバー側の実装によります)。
- キャッシュできません。
- 例:
DELETE /users/123: IDが123のユーザーを削除
-
PATCH:
- 目的: 特定のリソースを「部分的に」更新します。
- 特徴:
- リクエストボディに、更新したいリソースの「差分」情報を含めます。
- サーバー上のデータを変更します。
- べき等ではない場合が多いです(例えば、「数値フィールドに5を加算する」というPATCHリクエストは、複数回実行するとその都度加算されて結果が変わります)。
- キャッシュできません。
- 例:
PATCH /users/123: IDが123のユーザーの「メールアドレスだけ」を更新する(リクエストボディにメールアドレス情報のみを含める)
これらのHTTPメソッドを適切に使い分けることが、RESTful API設計の基本です。URIはリソースを指し示し、HTTPメソッドはそれに対して行う操作を指示します。
4.4 表現 (Representation)
リソースの状態は、クライアントとサーバー間で交換される「表現」を通じてやり取りされます。表現とは、リソースの現在の状態を特定のデータ形式でシリアライズ(データ構造をバイト列に変換すること)したものです。
最も一般的な表現形式は以下の2つです。
- JSON (JavaScript Object Notation): 軽量で人間にも読み書きしやすいデータ形式です。JavaScriptとの親和性が高く、Web APIで最も広く利用されています。
- XML (eXtensible Markup Language): 構造化されたデータを表現するための汎用的なマークアップ言語です。JSONが登場する以前はWeb APIの主流でした。
JSONの例(ユーザーリソースの表現):
json
{
"id": 123,
"username": "john_doe",
"email": "[email protected]",
"createdAt": "2023-10-27T10:00:00Z"
}
クライアントはリクエストのHTTPヘッダー(Acceptヘッダー)で、どのような形式のレスポンスを希望するかをサーバーに伝えることができます。サーバーはレスポンスのHTTPヘッダー(Content-Typeヘッダー)で、レスポンスボディに含まれるデータの形式を示します。
4.5 ステータスコード (Status Codes)
サーバーは、クライアントからのリクエストを処理した結果を、HTTPステータスコードとしてレスポンスに含めて返します。ステータスコードは3桁の数字であり、リクエストの成否や、その結果の詳細を示します。ステータスコードを見るだけで、クライアントはサーバー側の処理結果をある程度理解できます。
ステータスコードは以下のように分類されます。
- 1xx (Informational): リクエストは受け取られ、処理は継続中です。
- 2xx (Success): リクエストは成功しました。
- 3xx (Redirection): リクエストを完了するために、さらにアクションが必要です(例:リソースが別の場所に移動した)。
- 4xx (Client Error): クライアント側のエラーが原因でリクエストを完了できませんでした(例:不正なリクエスト、認証失敗)。
- 5xx (Server Error): サーバー側のエラーが原因でリクエストを完了できませんでした。
よく使われるステータスコードの例:
- 200 OK: リクエストは成功し、要求された情報がレスポンスボディに含まれています。GETリクエストの成功時など。
- 201 Created: リクエストは成功し、新しいリソースが作成されました。POSTリクエストの成功時など。レスポンスヘッダーの
Locationには、作成されたリソースのURIが含まれるべきです。 - 204 No Content: リクエストは成功しましたが、レスポンスボディには情報がありません。DELETEリクエストや、情報を返さないPUTリクエストの成功時など。
- 400 Bad Request: クライアントからのリクエストの形式が不正であるなど、クライアント側の問題でサーバーがリクエストを理解または処理できませんでした。
- 401 Unauthorized: リクエストには認証が必要です。認証情報がないか、無効です。
- 403 Forbidden: リクエストは有効ですが、クライアントにはリソースへのアクセス権限がありません。認証済みであっても拒否されます。
- 404 Not Found: 要求されたリソースがサーバー上に見つかりませんでした。
- 405 Method Not Allowed: リクエストされたURIに対して、使用されたHTTPメソッドは許可されていません(例:ユーザーリストのURI
/usersに対してDELETEメソッドを送信した)。 - 500 Internal Server Error: サーバーの内部で予期しないエラーが発生しました。サーバー側の問題です。
ステータスコードを適切に返すことは、RESTful APIの重要な側面です。これにより、クライアントはサーバーからの応答を容易に解釈し、適切なエラーハンドリングを行うことができます。
4.6 まとめ:REST APIの基本的な流れ
これらの要素を踏まえると、REST APIを使ったクライアントとサーバーのやり取りは、基本的なパターンに集約できます。
- クライアント: 操作対象の「リソース」(URIで指定)と、「行いたい操作」(HTTPメソッドで指定)を決定する。必要に応じて、操作に必要なデータ(表現)をリクエストボディに含める。
- クライアント: サーバーにHTTPリクエストを送信する(URI, メソッド, ヘッダー, ボディ)。
- サーバー: リクエストを受け取る。URIとメソッドを見て、どのリソースに対してどのような操作が要求されているかを判断する。
- サーバー: 認証・認可チェックを行い、操作が許可されているか確認する。リクエストボディがあれば、そのデータ(表現)を解釈する。
- サーバー: 要求された処理を実行する(データベースからのデータ取得、データ登録・更新・削除など)。
- サーバー: 処理結果に応じたステータスコードを選択し、必要に応じてレスポンスボディに結果データ(リソースの表現)を含める。適切なHTTPヘッダーを設定する。
- サーバー: クライアントにHTTPレスポンスを送信する(ステータスコード, ヘッダー, ボディ)。
- クライアント: レスポンスを受け取る。ステータスコードを見て処理結果を確認し、レスポンスボディがあればそのデータ(表現)を解釈して次の処理を行う。
このシンプルで統一されたやり取りのパターンが、REST APIの分かりやすさと使いやすさの基盤となっています。
第5章:REST APIの利用と設計のヒント
ここでは、初心者の方が実際にREST APIを利用したり、簡単なAPIを設計したりする際に役立つ実践的なヒントをいくつか紹介します。
5.1 REST APIを試してみるツール
プログラミングをしなくても、公開されているREST APIを試すことができる便利なツールがあります。
- Webブラウザ: 最も手軽なツールです。アドレスバーにURIを入力してアクセスするのは、本質的にはGETリクエストを送信することと同じです。多くのブラウザには開発者ツールが搭載されており、ネットワークタブでAPIへのリクエストやレスポンスの詳細(ヘッダー、ボディ、ステータスコードなど)を確認できます。ただし、GETリクエスト以外のメソッド(POST, PUT, DELETEなど)を直接送信するのは難しいです。
curlコマンド: コマンドラインからHTTPリクエストを送信できる強力なツールです。様々なオプションを使って、あらゆるHTTPメソッド、ヘッダー、ボディを含むリクエストを作成できます。- 例:
curl https://api.example.com/users/123(GETリクエスト) - 例:
curl -X POST -H "Content-Type: application/json" -d '{"username":"test"}' https://api.example.com/users(POSTリクエスト)
- 例:
- APIクライアントツール (例: Postman, Insomnia): これらのツールは、GUI(グラフィカルユーザーインターフェース)を使って簡単にHTTPリクエストを作成・送信し、レスポンスを確認できます。HTTPメソッド、URI、ヘッダー、ボディなどを分かりやすい画面で設定できるため、API開発者やテスターによく利用されます。初心者の方にもおすすめです。
これらのツールを使って、例えばパブリックに公開されている天気予報APIや、様々なサービスのAPI(開発者向けに公開されているもの)にアクセスしてみると、REST APIの実際の動きを体験できます。
5.2 簡単なREST APIの設計例
あなたがユーザー情報管理システムのための簡単なAPIを設計すると仮定しましょう。どのようなURIとHTTPメソッドの組み合わせが考えられるでしょうか。
- リソース: ユーザー (
users) - 操作:
- 全ユーザーリストを取得したい →
GET /users- レスポンス例:
200 OK, ボディにユーザーリスト(JSON配列)
- レスポンス例:
- 特定のユーザー(ID: 123)の情報を取得したい →
GET /users/123- レスポンス例:
200 OK, ボディにユーザー情報(JSONオブジェクト) - ID 123のユーザーが存在しない場合:
404 Not Found
- レスポンス例:
- 新しいユーザーを作成したい →
POST /users- リクエストボディ: 新しいユーザーの情報(JSON)
- レスポンス例:
201 Created, ボディに作成されたユーザーの情報、Locationヘッダーに作成されたユーザーのURI (/users/456) - リクエストデータが不正な場合:
400 Bad Request
- 特定のユーザー(ID: 123)の情報をすべて更新したい →
PUT /users/123- リクエストボディ: 更新後のユーザーの完全な情報(JSON)
- レスポンス例:
200 OKまたは204 No Content(更新後の情報を返すか否かによる) - ID 123のユーザーが存在しない場合:
404 Not Found - リクエストデータが不正な場合:
400 Bad Request
- 特定のユーザー(ID: 123)の情報を部分的に更新したい →
PATCH /users/123- リクエストボディ: 更新したい項目とその値(JSON、例:
{"email": "[email protected]"}) - レスポンス例:
200 OKまたは204 No Content - ID 123のユーザーが存在しない場合:
404 Not Found - リクエストデータが不正な場合:
400 Bad Request
- リクエストボディ: 更新したい項目とその値(JSON、例:
- 特定のユーザー(ID: 123)を削除したい →
DELETE /users/123- レスポンス例:
200 OKまたは204 No Content - ID 123のユーザーが存在しない場合:
404 Not Found
- レスポンス例:
- 全ユーザーリストを取得したい →
このように、リソースとHTTPメソッドを適切に組み合わせることで、直感的で理解しやすいAPIを設計できます。
5.3 APIのバージョン管理
APIは一度公開すると、それを様々なクライアントが利用し始めます。後からAPIの仕様を変更(例えば、レスポンスのJSON構造を変更したり、URIを変更したり)すると、古いAPIを使っているクライアントが動かなくなってしまう可能性があります。
このような問題を避けるために、APIにはバージョン管理を導入するのが一般的です。これにより、新しい仕様のAPIを公開しても、古いAPIを引き続き利用できるようにします。
バージョン管理の方法はいくつかありますが、代表的なのは以下の方法です。
- URIにバージョン番号を含める:
https://api.example.com/v1/users,https://api.example.com/v2/usersのように、URIのパスにバージョン番号を含めます。これが最も一般的で分かりやすい方法です。 - HTTPヘッダーにバージョン情報を含める: カスタムヘッダー(例:
X-Api-Version: 1.0)や標準のAcceptヘッダー(例:Accept: application/vnd.example.v1+json)を使う方法です。URIがシンプルに保たれるメリットがありますが、クライアント側での実装が少し複雑になることがあります。
APIを設計する際は、将来的な変更を想定して、最初からバージョン管理の仕組みを導入しておくことが推奨されます。
5.4 APIのセキュリティ
公開するAPIには、通常セキュリティ対策が必要です。誰でも自由にアクセスできてしまうと、情報漏洩や不正操作のリスクがあります。主要なセキュリティ対策には以下のようなものがあります。
- HTTPSの使用: HTTPではなくHTTPS (HTTP Secure) を使用します。HTTPSはSSL/TLSプロトコルによって通信が暗号化されるため、盗聴や改ざんを防ぐことができます。APIを提供するサーバーは、HTTPSでの接続を必須にすべきです。
- 認証 (Authentication): APIを利用しようとしているクライアントが「誰であるか」を確認する仕組みです。
- APIキー: クライアントにユニークなキーを発行し、リクエストのたびにそのキーをヘッダーやクエリパラメータに含めて送信してもらう方法です。シンプルですが、キーが漏洩すると悪用されるリスクがあります。
- Basic認証: ユーザー名とパスワードをBase64エンコードしてHTTPヘッダーに含める方法です。HTTPSと併用しないとパスワードが平文で流れるため危険です。
- OAuth 2.0: 多くのWebサービスで利用されている認証・認可のフレームワークです。ユーザーがサービスAに対して、別のサービスBのデータへのアクセスを許可する、といった複雑な連携を安全に行えます(例: 「Googleアカウントでログイン」「Twitter連携」)。クライアントはアクセストークンを取得し、そのトークンを使ってAPIにアクセスします。
- JWT (JSON Web Token): 認証情報をJSON形式で表現し、署名によって改ざんを検知できるようにしたトークンです。ステートレスなAPIに適しており、OAuth 2.0と組み合わせてよく利用されます。
- 認可 (Authorization): 認証されたクライアントが、要求されたリソースへのアクセスや操作を行う「権限を持っているか」を確認する仕組みです。例えば、「ユーザー情報の取得は許可するが、削除は管理者のみ許可する」といった制御を行います。
APIの種類や用途に応じて、適切なセキュリティ対策を選択し、実装する必要があります。
第6章:なぜREST APIは普及したのか? メリットとデメリット
RESTfulな設計原則に従ったAPI、すなわちREST APIがなぜこれほどまでに普及し、現代のWeb開発のデファクトスタンダードの一つとなったのでしょうか?その主な理由と、一方で存在するデメリットについても見ていきましょう。
6.1 REST APIのメリット
REST APIが広く採用された理由は、その設計思想が現代のWebの要求によく合致しているからです。
- シンプルさと分かりやすさ:
- HTTPの標準的なメソッド(GET, POST, PUT, DELETEなど)を使うため、直感的に理解しやすいです。URIとメソッドの組み合わせで、リソースへの操作が明確になります。
- JSONのような軽量で人間にも読みやすいデータ形式が主に使われます。
- スケーラビリティ (Scalability):
- ステートレスな性質により、サーバー側はクライアントの状態を気にすることなく、どのリクエストも独立して処理できます。これにより、サーバーを水平に拡張(サーバー台数を増やす)しやすく、大量のリクエストにも対応しやすくなります。
- キャッシュ可能な性質により、サーバーの負荷を軽減し、レスポンス速度を向上させることができます。
- クライアント・サーバー間の独立性:
- クライアントとサーバーが分離しているため、それぞれの開発・変更・更新を独立して行えます。サーバー側の内部実装を変更しても、API仕様が変わらなければクライアントは影響を受けません。
- 様々なプラットフォーム(Webブラウザ、スマートフォンアプリ、デスクトップアプリなど)のクライアントが、同じAPIを利用できます。
- 幅広い互換性:
- HTTPというインターネットの基盤となるプロトコルを使用しているため、特別なライブラリやフレームワークに依存せず、様々なプログラミング言語や環境から容易に利用できます。ほとんど全ての環境がHTTPクライアント機能を持っています。
- パフォーマンス:
- ステートレスで、リソースの表現のみをやり取りするため、SOAPのような他の方式に比べてメッセージサイズが小さくなる傾向があり、通信量が削減できます。
- キャッシュの活用により、レスポンス速度を向上させることができます。
- 普及度と開発コミュニティ:
- 非常に広く普及しているため、関連情報やツール、ライブラリが豊富に存在します。困ったときに情報を探しやすく、開発しやすい環境があります。
これらのメリットにより、特にWebサービスやモバイルアプリケーションのバックエンドAPIとして、REST APIは非常に適しています。
6.2 REST APIのデメリット
一方で、REST APIにもいくつかの考慮すべきデメリットや課題があります。
- HATEOASの完全な実装の難しさ: RESTfulの重要な原則であるHATEOASを完全に実装するのは難しく、多くのAPIはHATEOASを無視または部分的にしか実装していません。これにより、APIの自己発見性や、クライアントとサーバーの真の独立性(サーバー側がAPIのURI構造などを変更した際にクライアントがそれに追従しにくくなる)が損なわれることがあります。
- 過剰なデータ取得 (Over-fetching) / 不足したデータ取得 (Under-fetching):
- Over-fetching: クライアントが必要とする以上のデータがレスポンスに含まれてしまう問題です。例えば、ユーザーの名前だけが欲しいのに、APIがユーザーの全情報(住所、電話番号など)を返してしまう場合です。これは通信量の無駄になります。
- Under-fetching: 1つの画面を表示するために、複数のAPIエンドポイントに何度もリクエストを送信する必要がある問題です。例えば、ユーザー情報と、そのユーザーの最新の3つの記事情報を表示したい場合、まずユーザー情報を取得するAPIを呼び出し、次に記事情報を取得する別のAPIを呼び出す必要があるかもしれません。これはクライアント側の実装を複雑にし、通信の往復が増えることで表示速度が遅くなる原因になります。
これらの問題は、リソースという単位で操作を行うRESTの設計に起因します。GraphQLのような代替技術は、このOver-fetching/Under-fetching問題の解決を目指して登場しました。
- 複雑な操作の表現: 「複数のリソースを一度に更新する」「特定の条件を満たすリソースに対して一括で処理を行う」といった複雑な操作を、標準的なHTTPメソッドとURIだけで直感的に表現するのが難しい場合があります。このような場合は、RESTfulの原則から外れて、操作名を含むURIを使ったり(例:
/users/deactivate_all)、POSTメソッドを汎用的な処理のトリガーとして使ったりすることがあります。 - ステートフルな処理の扱い: 基本的にステートレスな設計であるため、ログイン状態の維持や複数ステップにわたるトランザクションなど、状態を伴う処理を設計・実装する際には追加の工夫(トークン、セッション管理など)が必要になります。
これらのデメリットがあるにも関わらず、そのシンプルさ、普及度、そして多くのWebサービスの要件に対して十分に優れた特性を持つことから、REST APIは依然としてWeb開発の主流であり続けています。
第7章:REST APIの今後と関連技術
REST APIは現代のWebを支える重要な技術ですが、技術は常に進化しています。REST APIの今後の動向や、関連する、あるいは代替となる可能性のある技術についても簡単に触れておきましょう。
- GraphQL: Facebookが開発したAPIのためのクエリ言語およびランタイムです。クライアントが必要なデータの構造をリクエストで正確に指定できるのが最大の特徴です。これにより、前述のRESTのデメリットであるOver-fetching/Under-fetching問題を解決できます。一つのエンドポイントに対して柔軟なクエリを送信することで、複数のリソースから必要なデータだけを効率的に取得できます。REST APIの代替として注目されており、利用が増えています。
- gRPC (gRPC Remote Procedure Call): Googleが開発したRPC(Remote Procedure Call)フレームワークです。HTTP/2をベースとし、Protocol Buffersという仕組みを使って構造化データを効率的にシリアライズ/デシリアライズします。主にシステム間の内部通信(マイクロサービス間の通信など)で、高速性や効率性が求められる場合に利用されます。RESTのようにリソース指向ではなく、関数やサービス呼び出しの考え方に基づいています。
- 非同期API (AsyncAPI, Webhooksなど): REST APIは基本的にリクエスト/レスポンスの同期的な通信モデルです。しかし、「〇〇が発生したらサーバーからクライアントに通知する」といった非同期的なイベント駆動型の連携のニーズも増えています。WebhooksやWebSocket、メッセージキューイングシステムなどを使ったAPIが、このような非同期通信のニーズに対応しています。AsyncAPIは、このようなイベント駆動型APIの仕様記述のための標準フォーマットです。
これらの技術は、REST APIが苦手とする部分を補ったり、異なる種類のアプリケーション連携に適していたりします。しかし、REST APIのシンプルさ、普及度、そしてWebとの親和性の高さは揺るぎなく、今後もWeb開発の主要なAPIスタイルであり続けると考えられます。
まとめ:REST APIへの第一歩
この記事では、初心者の方に向けてREST APIの基本を徹底的に解説しました。
- API とは、プログラム同士が連携するための「窓口」と「お約束」。
- Web API は、インターネット上でHTTPを使って通信するAPIであり、クライアントとサーバー間のリクエスト・レスポンスでやり取りされる。
- REST は、Webの成功要因を分析して導き出されたWebサービスの「設計思想」であり、その原則(Client-Server, Stateless, Cacheable, Layered System, Uniform Interface)に従って設計されたAPIを RESTful API と呼ぶ。
- REST API は、操作対象を リソース と見なし、それをURIで識別し、HTTPメソッド(GET, POST, PUT, DELETEなど)とリソースの 表現(JSON, XMLなど)を使って操作する。
- サーバーは ステータスコード でリクエストの成否や結果をクライアントに伝える。
- REST APIは、そのシンプルさ、スケーラビリティ、独立性、互換性の高さから広く普及したが、Over-fetching/Under-fetchingなどの課題も抱える。
REST APIは、現代の多くのWebサービス、モバイルアプリ、そしてシステム連携において中心的な役割を果たしています。Twitterのツイート取得、Googleマップでの場所検索、オンライン決済サービスの利用など、あなたが普段利用している様々なサービスの裏側で、REST APIが活躍しています。
この記事で解説した内容は、REST APIのほんの入り口に過ぎません。しかし、これらの基本的な概念を理解していれば、APIドキュメントを読んだり、実際にAPIを利用したり、さらには自分で簡単なAPIを設計したりするための強固な基盤となります。
もしあなたがWeb開発やプログラミングを学ぶ上でAPI、特にREST APIに出会ったなら、この記事で得た知識がきっと役に立つはずです。ぜひ、Postmanやcurlなどのツールを使って、実際に動いているAPIに触れてみてください。概念的な理解が、より実践的なものとなるでしょう。
REST APIは決して難しいものではありません。HTTPという身近なプロトコルを基盤とし、Webの設計思想を取り入れた、合理的でパワフルな仕組みです。この解説が、あなたのREST API理解への第一歩となり、今後の学習や開発の助けとなれば幸いです。
さあ、REST APIの世界を探求し、その可能性を最大限に活用していきましょう!