クイックダウンロード:
単なるWeb APIをREST APIと呼ぶのは、単なる意味論的な議論ではない。それは、その後のあらゆるアーキテクチャ上の決定に影響を与える。
-
Web APIとはHTTP経由でアクセス可能なあらゆるインターフェースを指しますが、REST APIは特定のアーキテクチャスタイルであり、6つの定義上の制約があり、自称REST APIのほとんどはこれらの制約を完全に実装していません。
-
この区別は、キャッシング、ステートレス性、そして統一されたインターフェース設計にとって重要です。この境界線を曖昧にするチームは、拡張性と保守性をより困難にするシステムを構築してしまいます。
-
SOAP、GraphQL、gRPC、RESTはすべてWeb APIですが、設計思想とトレードオフが根本的に異なります。
-
APIのスタイルを選択する前に、まず制約を明確に定義しましょう。ステートレス性、キャッシュ可能性、統一されたインターフェースがユースケースに合致するなら、RESTはその名にふさわしいものとなります。
現代のWebおよびアプリ開発において、アプリケーションプログラミングインターフェース(API)はシステム、アプリケーション、プラットフォームの基盤となっています。数多くのAPIの種類の中でも、REST APIとWeb APIは開発者がよく目にする用語です。
Web APIとREST APIの違いとは?このガイドでは、これらの概念を詳しく解説し、開発者がそれぞれのユースケースに最適なAPIプロトコルを選択できるよう支援します。
違いの概要:Web APIとREST API
| Difference | Web API | REST API |
|---|---|---|
| 彼らが何でありますか | Web APIは、HTTPまたはHTTPSを使用するあらゆるAPIを包含します。すべてのREST APIはWeb APIですが、すべてのWeb APIがRESTfulであるとは限りません。 | REST APIは、ステートレス性やクライアント/サーバーアーキテクチャといった特定のアーキテクチャ原則に従うWeb APIです。 |
| 州/地域 | 技術的には、ステートレスにもステートフルにもなり得る。 | ステートレス性とは、API呼び出しのセッション間で、プログラムをホストするサーバーが適切なアクションを実行するためにセッション間で情報を「記憶」したり保持したりする必要がないことを意味します。 |
| いつ選ぶか | 非RESTful Web APIは、ステートフルな操作、WebサーバーとのACID準拠のトランザクション、およびレガシーシステムとの連携に使用されます。 | RESTful APIを非RESTful APIよりも選択する際の主な考慮事項は、ステートレス性です。 |
| 一般的な使用例 | 多くのレガシーシステム、特にハードウェアやIoTデバイスなどのシステムと通信するシステムは、RESTベースではないAPIも使用しています。 | RESTful APIは、異なるシステム間での標準化された通信と相互運用性を必要とするWebサービスでよく使用されます。 |
Web APIとは何ですか?
Web API は、アプリケーションが HTTP または HTTPS プロトコルを介して相互にやり取りできるようにするインターフェースです。ソフトウェア アプリケーションの構築と操作に関する一連のルールとプロトコルを提供します。REST、SOAP、GraphQL など、Web API には多くの種類があります (下記参照)。Web API と REST API という用語は、時として同じ意味で使われますが、すべての Web API が REST API であるとは限らないことに注意することが重要です。技術的には、Web API は、以下の表にまとめられているように、通信プロトコルとして HTTP を使用するさまざまなタイプの API を包括する用語です。
| Web APIタイプ | 詳細説明 | タイプ |
|---|---|---|
| REST | RESTアーキテクチャに準拠 | RESTful |
| 石鹸 | XMLと厳格な標準規格を採用 | 非RESTful |
| GraphQL | 柔軟なクエリ言語 | 非RESTful |
以下では、これらの一般的なタイプについて詳しく見ていきましょう。
REST API
REST APIは、RESTの原則に準拠したWeb APIの一種です。RESTの原則は、ステートレス性、使いやすく自己記述的なメッセージ、そしてスケーリングを容易にするためのコンポーネントのキャッシュを可能にする階層構造を重視しています。これらの原則については、この記事の後半で詳しく説明します。
以下は、RESTful Web API の Python コード例です。
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/users', methods=['GET'])
def get_users():
return jsonify({'users': ['Alice', 'Bob']})
if __name__ == '__main__':
app.run()このコードはHTTPメソッドとステートレス通信を使用しているため、RESTの原則に準拠しています。
ソープAPI
シンプルオブジェクトアクセスプロトコル(SOAP)は、Webサービスを実装するために構造化された情報を交換するためのプロトコルです。RESTとは異なり、SOAPは XMLベースのメッセージングと厳格な基準。
以下は、SOAP Web API の Python コード例です。
from spyne import Application, rpc, ServiceBase, String
from spyne.protocol.soap import Soap11
from spyne.server.wsgi import WsgiApplication
class HelloWorldService(ServiceBase):
@rpc(String, _returns=String)
def say_hello(ctx, name):
return f"Hello, {name}"
application = Application([HelloWorldService], 'spyne.examples.hello.soap',
in_protocol=Soap11(validator='lxml'),
out_protocol=Soap11())
wsgi_application = WsgiApplication(application)グラフQL API
グラフQL API
GraphQLは、より柔軟で効率的なデータ取得方法を提供するAPI向けクエリ言語です。RESTは様々なリソースに対して複数のエンドポイントを公開しますが、GraphQLはすべてのやり取りに対して単一のエンドポイントを公開します。この単一のエンドポイントにより、クライアントはオブジェクトの個々のフィールドに至るまで、必要なデータを正確に要求できます。
RESTでは、関連データを収集するために、通常は複数のエンドポイントにリクエストを送信する必要があります。たとえば、書籍とその著者に関する情報を取得したい場合、まず/books/{id}エンドポイントから書籍の詳細を取得し、次に/authors/{id}エンドポイントから著者の詳細を取得するといった手順を踏むことになります。GraphQLでは、必要な情報を正確に指定することで、これらの関連データをすべて単一のクエリで取得できます。
書籍と著者に関する情報を提供するGraphQL APIがあるとします。書籍のタイトルと著者名を取得したい場合、以下のGraphQLクエリでそれが可能です。
query {
book(id: "1") {
title
author {
name
}
}
}このクエリは、IDが「1」の書籍を要求し、その書籍のタイトルと著者名を要求します。
サーバー側では、Grapheneのようなライブラリを使用してPythonで記述されたリゾルバ関数でこのクエリを処理することができます。以下に簡単な例を示します。
import graphene
class Author(graphene.ObjectType):
name = graphene.String()
class Book(graphene.ObjectType):
title = graphene.String()
author = graphene.Field(Author)
class Query(graphene.ObjectType):
book = graphene.Field(Book, id=graphene.String())
def resolve_book(self, info, id):
# Fetch the book from your data source using the provided id
book_data = get_book_by_id(id)
return Book(title=book_data['title'], author=Author(name=book_data['author_name']))
schema = graphene.Schema(query=Query)このコードは、GraphQLの型であるAuthorとBook、およびIDで書籍を取得できるクエリを定義しています。resolve_book関数は実際にデータを取得する役割を担います。実際のアプリケーションでは、get_book_by_id関数を実装して、データベースやその他のデータソースからデータを取得します。
アーキテクチャ:非RESTful Web APIとREST APIの比較
REST APIと非REST APIの主な違いは、データの処理方法にあります。以下で詳細を見ていきましょう。
REST API
RESTful APIは、GET、POST、PUT、DELETEといった標準的なHTTPメソッドを通じて、データの取り込みを容易にします。この標準化により、様々なプラットフォームやツールとの連携が容易になります。
ステートレス
ステートレス性により、サーバーはリクエスト間でクライアントの状態に関する情報を保持する必要がなくなります。クライアントからの各リクエストには、処理に必要なすべての情報が含まれているため、データ処理が簡素化されます。ステートレス性はREST APIの主要な設計上の考慮事項です。サーバーが何も知る必要も記憶する必要もない場合は、おそらくREST APIが最適な選択肢となります。
スケーラブル
RESTはステートレスな性質を持つため、共有状態を気にすることなく新しいインスタンスを簡単に追加でき、拡張性に優れています。RESTを利用することで、AWS Lambda、GCP Cloud Functions、Azure Functionsなどのサーバーレス技術を用いてデプロイされたシンプルなマイクロサービスでも、毎秒数百万件以上のリクエストを処理できます。
簡単に使える
RESTful APIで標準的なHTTPメソッドを使用することで、データの送受信プロセスが簡素化されます。例えば、FlaskやFastAPIのようなパッケージを使えば、15行以下のコードと1つのインポート文だけでシンプルなAPIを作成できます。このシンプルさによって、開発者は開発を始めやすくなり、チームメンバー間のコラボレーションも促進されます。データの取り込み方や処理方法について全員が共通認識を持つことで、開発サイクルが加速し、コード品質の維持にもつながります。
非RESTful Web API
SOAPなどのRESTfulではないAPIでは、データ取り込みのために特定のプロトコルや標準規格が必要となる場合があります。
複雑
SOAPのようなRESTfulではないAPIでは、特定のヘッダーやXMLベースのリクエストボディが必要になる場合があり、データ取り込みが複雑になる。
ステートフルネス
RESTfulではないAPIの中には、リクエスト間で状態を保持するものがあり、データ処理が複雑になるが、データストリーミングやゲームアプリケーションなどのサービスに展開されるWebSocketのような特定のユースケースでは必要となる場合がある。
セキュリティ
SOAPのようなプロトコルには、WS-Securityなどの組み込みセキュリティ標準が含まれていることが多く、これは安全なデータ送信に役立ちます。セキュリティは、今日、開発者がRESTではなく非RESTful Web APIを選択する理由の一つです。
柔軟性
非RESTful APIは、特に企業環境において、複雑な操作やトランザクションを処理する際に、より高い柔軟性を提供する。
APIパフォーマンス:非RESTful Web APIとREST APIの比較
アーキテクチャ以外にも、パフォーマンスは非RESTful Web APIとREST APIのどちらを選ぶかという議論において重要な考慮事項となる。
REST API
REST APIは、ステートレスな性質と標準的なHTTPメソッドへの依存により、多くの場合、優れたパフォーマンスを発揮します。一般的にSOAPで使用されるXMLよりも軽量なJSONを使用するため、データの転送と処理が高速化されます。また、HTTPキャッシュメカニズムを活用することで、応答時間を改善します。クライアントまたは中間プロキシは、応答をキャッシュして取得速度を向上させることができます。
RESTのステートレスな性質は、クライアントセッションを管理する必要がないため、サーバーのオーバーヘッドを削減します。これにより、パフォーマンスとスケーラビリティが向上します。前述のとおり、サーバーレス技術は、高性能なREST APIのコストを劇的に削減します。
非RESTful Web API
非RESTful APIは、特定のユースケースに合わせた特殊なパフォーマンス機能を提供します。一部の非RESTful APIは、複数のリクエストを単一のHTTPリクエストにバッチ処理することで、オーバーヘッドを削減し、パフォーマンスを向上させます。また、送信データのサイズを縮小し、送信速度を向上させる特定の圧縮アルゴリズムをサポートしている場合もあります。さらに、特定のシステムやユースケース固有の要件に合わせて、パフォーマンスを最適化するように設計することも可能です。
例えば、RESTと比較して、GraphQLが提供する粒度の高さは、データの過剰取得や不足取得を減らし、Webアプリケーションのパフォーマンスを向上させる上で特に役立ちます。クライアントは必要なデータだけを正確に要求でき、過不足はありません。
さらに、GraphQL APIは厳密な型付けがされているため、クエリとレスポンスの検証が容易です。GraphQLは、より柔軟なクエリ言語を提供することで、特に複雑なクエリや複数の関連リソースを必要とする様々なユースケースにおいて、RESTに代わる強力な選択肢となります。
ユースケース:非RESTful Web APIとREST APIの比較
用途によって考慮すべき細かな点が異なるため、特定のAPIタイプを選択するのは難しい場合があります。以下に、いくつかの提案をまとめた表を示します。
REST API
| Use Case | 説明 |
|---|---|
| ステートレスアプリケーション | RESTはスケーリングを簡素化し、容易なキャッシュを可能にするため、各リクエストに処理に必要なすべての情報が含まれるステートレスな操作に最適です。 |
| スケーラブルなシステム | RESTful APIはステートレスな性質を持つため、共有状態を気にすることなく新しいインスタンスを容易に追加でき、拡張性が向上します。 |
| 相互運用可能なソリューション | RESTful APIは標準的なHTTPメソッドを使用するため、様々なシステムやプログラミング言語との相互運用性が非常に高い。 |
| シンプルなCRUD操作 | RESTful APIは、標準的なHTTPメソッド(POST、GET、PUT、DELETE)に準拠しているため、単純な作成、読み取り、更新、削除(CRUD)操作に適しています。 |
| 公開されているAPI | RESTのシンプルさと標準化された性質は、APIを様々なクライアントに公開する予定がある場合に良い選択肢となるでしょう。 |
非RESTful Web API
| Use Case | 説明 |
|---|---|
| ステートフルオペレーション | 非RESTful APIは、サーバーがリクエスト間でクライアントの状態に関する情報を保持する必要があるステートフルなタスクに適しています。これは、複雑なトランザクションやワークフローに役立ちます。 |
| 複雑なクエリ | GraphQLのような非RESTful APIでは、クライアントが必要なデータを正確に要求できるため、より複雑で最適化されたクエリが可能になります。 |
| 安全なトランザクション | SOAPのようなプロトコルにはセキュリティ基準が組み込まれているため、安全な取引やデータ伝送に適している。 |
| レガシー システムとの統合 | 特定のプロトコルやデータ形式を必要とするレガシーシステムとの統合には、RESTfulではないAPIの方が適している場合があります。 |
| リアルタイムコミュニケーション | リアルタイムの通信や更新には、クライアントとサーバー間で継続的な双方向通信を可能にするWebSocketsのようなRESTfulではないソリューションの方が適している場合があります。 |
Web APIのパフォーマンス監視で注目すべき点
RESTfulおよび非RESTful Web APIの両方のパフォーマンスを監視することは、良好なデジタルユーザーエクスペリエンスを維持するために不可欠です。これを適切に行うには、基本的な稼働状況チェックや単純な応答時間指標を超えた機能が必要です。
経路全体にわたるエンドツーエンドの可視性
最新のソリューションは、エンドユーザーとAPIの間でリクエストが通過するすべてのコンポーネントに関する情報を提供する必要があります。これには以下が含まれます。
- APIエンドポイントアドレスのDNS解決
- APIレスポンスを提供するコンテンツ配信ネットワーク(CDN)
- インターネットサービスプロバイダーおよび中間ネットワーク
- APIの背後にあるゲートウェイ、マイクロサービス、および下流の依存関係
この包括的な視点により、速度低下の原因が自社サービスにあるのか、それとも依存しているサードパーティのインフラストラクチャにあるのかを理解するのに役立ちます。
ユーザー視点からのモニタリング
実際の体験を正確に反映するためには、以下の機能を備えたツールを探しましょう。
- 実ユーザーモニタリング(RUM)と合成モニタリング(エミュレートされたAPIトランザクション)を組み合わせる
- 複数の地域、ネットワーク、およびデバイスの種類(デスクトップ、モバイルなど)からテストを実行します。
- さまざまな条件下でもAPIが応答性を維持することを継続的に検証する
例えば、API呼び出しの遅延は、アプリケーションコードだけでなく、DNS解決の遅延、CDNエッジの性能低下、経路上のISPにおけるルーティングの問題などによっても発生する可能性がある。
バックエンドと依存関係の認識
効果的なAPIパフォーマンス監視は、サーバー側で何が起こっているかも明らかにするはずです。
- 上流および下流のサービス全体を追跡して依存関係を明らかにする
- APIレイテンシに影響を与える、遅いまたは非効率的なコードパスを可視化する
- あるサービスの変更が取引全体のパフォーマンスにどのような影響を与えるかについての背景情報
これにより、ネットワークレベルの問題とアプリケーションレベルのボトルネックを区別しやすくなる。
DevOpsおよびSREチームにとって重要な機能
ソリューションを評価する際、チームは通常、以下の能力を必要とします。
- 回帰分析および長期トレンド分析のために、可用性、レイテンシ、およびカスタムKPIメトリクスを取得します。
- 機能テストのためにAPIトランザクションを実行し、想定されるペイロードに対して応答を検証する。
- エンドポイント、マイクロサービス、ゲートウェイからなる複雑なネットワーク全体でデータ整合性を確保し、サービス提供を保証する。
- SaaSプロバイダーの責任とされることが多いパブリックインターネットコンポーネントを含む、トランザクションパス全体を監視します。
- ユーザーがチケットを発行したり、パフォーマンスについて苦情を申し立てたりする前に、APIインシデントをリアルタイムで検知して管理します。
OpenTelemetryなどのオープンスタンダードのサポートは、独自の計測機器への依存を回避し、APIテレメトリと他のオブザーバビリティデータを関連付けやすくするのにも役立ちます。
結論
Web APIには、RESTfulなものと非RESTfulなものがあります。非RESTful APIにはより多くの種類があり、RESTful APIが最も一般的なアプローチですが、開発者にとって両方を理解し活用できる準備は不可欠です。非RESTful Web APIとREST APIのどちらを選択するかは、アプリケーションの具体的な要件とサポートする必要のあるユースケースによって異なります。
現代のアプリケーションのほとんどは、何らかの形でRESTful APIを使用しているため、APIの導入と開発について学び始めたばかりであれば、ここから始めるのが最も理にかなっています。さらに、サーバーレスの導入・ホスティング技術の進歩に伴い、REST APIはシンプルさ、拡張性、標準化を実現し、開発において最も費用対効果が高く効率的なアプローチとなることが多くなっています。とはいえ、複雑なタスクや特殊なタスクにおいては、RESTfulではないWeb APIの方が、より高い柔軟性、セキュリティ、そしてカスタマイズされた機能を提供できる場合もあります。
RESTからGraphQL、gRPCまで、スタック内のすべてのAPIを監視します。
LogicMonitorは、あらゆるAPIスタイルとプロトコルにわたって一貫した可視性を提供するため、今日下したアーキテクチャ上の決定が、明日には監視上の問題となることはありません。
よくあるご質問
すべてのREST APIはWeb APIなのか?
はい、すべてのREST APIはHTTP/HTTPSを介して通信するため、Web APIです。しかし、すべてのWeb APIがREST APIであるとは限りません。SOAP API、GraphQL API、gRPC API、WebSocket APIはすべて、RESTのアーキテクチャ上の制約に従わないWeb APIです。RESTは、より広範なWeb APIカテゴリの特定のサブセットであり、同義語ではありません。
REST APIを真にRESTfulなものにする要素は何でしょうか?
真のRESTful APIは、ロイ・フィールディングが提唱した6つのアーキテクチャ上の制約、すなわちクライアント・サーバー分離、ステートレス性、キャッシュ可能性、統一インターフェース、階層型システム、そしてオプションでコードオンデマンドをすべて満たす必要があります。実際には、RESTと称されるAPIのほとんどは、これらの制約の一部(特にステートレス性と統一インターフェース)のみを実装し、キャッシュ可能性とHATEOASは完全に無視しています。
Web APIとREST APIの区別は、実際にはなぜ重要なのでしょうか?
これはアーキテクチャ上の意思決定に影響を与えます。REST APIを構築する場合、ステートレス性、キャッシュ可能性、統一されたインターフェースを設計する必要があり、これはスケーラビリティとクライアント設計に大きな影響を与えます。一方、HTTPベースのAPIを構築する場合は、これらの制約は不要であり、課すと複雑さが増す可能性があります。構築するものを明確にすることで、後々の設計上の不一致によるコスト増を防ぐことができます。
SOAPとは何か?そして、それは今でも有効なのか?
SOAP(Simple Object Access Protocol)は、XMLメッセージングと正式なWSDL契約を使用するWeb APIプロトコルです。RESTよりも歴史が古く、新規開発ではあまり一般的ではありません。しかし、厳密な型付け、組み込みのエラー処理、WS-Security標準といった特長から、既存システムの統合に適しているため、企業環境(特に金融サービスや医療分野)では依然として広く利用されています。




