皆さんもHTTPをよく耳にしているのでしょう。HTTPの実質はプロトコールの一種になります。現在のインターネットでは、大部のデータ交換プロセスは、HTTPというプロトコルに基づいて行われています。APIの面から見ても、HTTPプロトコルをベースにして設計されているものも少なくありません。主流となっているRESTやSOAPなどもHTTPプロトコルを採用しています。
本文では、API技術とAPIプロトコルをより深く探索して、世界中で広く利用されているAPIプロトコルTop 8をまとめて皆さんに紹介していきたいと思います。また、Apidogは、主流のAPIプロトコルにも対応可能なAPI管理ツールになります。異なるタイプのAPIを一括に管理したい場合は、Apidogを試してください。
APIプロトコルとは
APIプロトコルとは、API(Application Programming Interface)で実際にデータ送受信の通信を行うための通信規約のことを指します。
代表的なAPIプロトコルとしては以下のようなものがあります。
- HTTP(Hypertext Transfer Protocol) - ウェブブラウザとサーバ間の通信プロトコル
- HTTPS(HTTP over TLS/SSL) - HTTPにセキュリティを加えたもの
- WebSocket - クライアントとサーバ間の全二重通信
- GraphQL - Facebook発のクエリ言語
この中でも、最も一般的なのはHTTPおよびHTTPSです。ほとんどのWeb APIは、リクエストとレスポンスのやり取りにこれらのプロトコルを利用しています。
APIサーバがデータを提供するエンドポイントを公開し、クライアントはそこに対してHTTPメソッドを使ってアクセスします。そしてサーバはリクエストに応じたデータをHTTPレスポンスとして返します。
このように、APIプロトコルはAPIの仕様だけでなく、実際の通信手順も標準化することで、アプリケーション間の円滑なデータ連携を実現しています。
APIプロトコルの構成
一般的には、APIのプロトコルには次の部分を含まれることがあります。
- 仕様定義言語: APIのデータ構造を定義する言語です。例えば、OpenAPIなどAPIの仕様定義に使われるYAML /JSON。
- ネットワーク転送プロトコル: HTTP、WebSocketなどデータ転送に使うプロトコル
- データ交換フォーマット: JSON、XMLなどデータ encode/decode のフォーマット
これらの要素を組み合わせることで、さまざまなAPIプロトコルを作ることができます。例えば:
- OpenAPI仕様(仕様定義言語)とHTTP(ネットワーク転送プロトコル)とJSON(データ交換フォーマット)を組み合わせると、REST APIになります。
- gRPC IDL(仕様定義言語)とHTTP/2(ネットワーク転送プロトコル)とProtobufJSON(データ交換フォーマット)を組み合わせると、gRPC APIになります。
現状として、ユーザーはこれらの要素全てを「APIプロトコル(API技術)」と呼ぶことがあるでしょう。が、正確に言うと、仕様定義言語は「API仕様」、ネットワーク転送プロトコルは「転送プロトコル」、データ交換フォーマットは「データエンコードプロトコル」と呼ぶのがより正確だと思います。
人気のAPIプロトコルのランキング
「2023 Global API Status Report」というレポートから、全世界の開発者に多く利用されているAPIプロトコルを確認することができます。
- REST
- GraphQL
- SOAP/Web Service
- WebSocket
- Socket
- SSE
- gRPC
- MsgPack
それでは、これらのAPIプロトコルの違いは何ですか?APIプロトコルはなぜこんなに多く存在していますか?これらのプロトコルを使用するには、どうしたらいいですか?
本文では、Top 8 APIプロトコルを皆さんに詳しく解説していくので、前述のような質問を持っている場合は、お読み続けください。
Top 1. REST (Representational State Transfer)
REST(Representational State Transfer)とは、実質のプロトコルではなく、APIを設計する際のアーキテクチャスタイルの1つになります。RESTはHTTPプロトコルを活用し、APIの設計原則とデータ転送の方式を定義しています。例えば:
GETメソッド:データ取得
GET /books
:すべての書籍を検索GET /books/{id}
:IDを使って特定の書籍を検索
POSTメソッド:新規データ作成
POST /books
:新しい書籍を作成
PUTメソッド:データの全更新
PUT /books/{id}
:IDを使って既存の書籍を更新
DELETEメソッド:データ削除
DELETE /books/{id}
:IDを使って特定の書籍を削除
RESTはシンプルかつスケーラブルなAPIを実現できるアーキテクチャとして、Web APIの分野で広く使われています。
Top 2. GraphQL
GraphQLはAPIのためのクエリ言語および実行環境の仕様です。Facebookが開発し、現在はオープンソースプロジェクトとして開発が進められています。
GraphQLの主な特徴は以下の通りです。
- クライアントが必要なデータを明示的に指定できる点
- 1つのエンドポイントで様々なデータを取得可能
- 強い型付けによりスキーマが定義されている
- APIのドキュメントが自動生成される
GraphQLを使うと、クライアントは取得したいデータのフィールドをクエリに指定できます。これにより通信のオーバーヘッドが下がり、パフォーマンスが向上します。また、1つのエンドポイントでさまざまなデータの取得ができるため、エンドポイントが増えることもありません。
GraphQL APIのサンプル
GraphQL APIへの理解をより深めるために、そのサンプルコードを紹介します。
// ユーザー1人を取得するクエリ
query {
user(id: 1) { // 引数としてIDを指定
name // 取得したいフィールドを指定
age
}
}
// ユーザーを作成するミューテーション
mutation {
createUser(name: "Bob", age: 20) { // 引数でユーザー情報を指定
id // 返り値としてIDを取得
name // 名前も返り値として取得
}
}
// すべてのユーザーを取得するクエリ
query {
allUsers {
name
age
}
}
- queryはデータ取得、mutationはデータ変更
- 引数を指定して条件に合うデータを取得
- 返り値のフィールドを指定する
- 1つのエンドポイントで複数のクエリが可能
このように、GraphQLは取得したいデータを明示的に指定するのが特徴です。
Top 3. SOAP (Simple Object Access Protocol)/Web Service
SOAP(Simple Object Access Protocol)は、ウェブサービス間での情報交換を目的とした通信プロトコルです。SOAPはXML(eXtensible Markup Language)ベースのプロトコルであり、クライアントとサーバー間でメッセージをやり取りするためのルールや形式を提供します。また、SOAPは、異なるプラットフォームやプログラミング言語間での相互運用性を提供するために広く使用されてきました。また、セキュリティやトランザクション管理などの機能もサポートしており、信頼性の高いウェブサービス通信を実現することができます。
SOAP APIのサンプル
SOAP APIを使用してデータを送受信するには、SOAPリクエストを作成し、それを送信するためのクライアントプログラムを書く必要があります。以下に、Pythonを使用してSOAP APIリクエストのサンプルを提供します。
この例では、Pythonのzeep
ライブラリを使用してSOAPリクエストを作成し、送信します。まず、zeep
ライブラリをインストールします。
bashCopy code
pip install zeep
次に、以下のサンプルコードを使用してSOAPリクエストを作成し、送信することができます。この例では、SOAP APIエンドポイント、操作、およびパラメータを適切に設定する必要があります。
pythonCopy code
from zeep import Client
# SOAP APIエンドポイントのURLを指定
soap_url = 'https://example.com/soap-endpoint'
# SOAP APIクライアントを作成
client = Client(soap_url)
# SOAPリクエストの操作名とパラメータを設定
operation_name = 'YourOperationName'
parameters = {
'param1': 'Value1',
'param2': 'Value2'
}
# SOAPリクエストを送信
response = client.service.YourOperationName(**parameters)
# レスポンスを表示
print(response)
このコードでは、zeep
ライブラリを使用してSOAP APIクライアントを作成し、指定したエンドポイントに対してSOAPリクエストを送信しています。操作名とパラメータは、SOAP APIの仕様に合わせて適切に設定する必要があります。
Top 4. WebSocket
WebSocket APIは、双方向のリアルタイム通信を実現するためのプロトコルとAPIの組み合わせです。通常のHTTPリクエストとは異なり、クライアントとサーバーが接続を確立した後、両者がデータを相互に送受信するためのパーマネントな接続を提供します。
WebSocket APIのサンプル
WebSocket APIを使用してデータを送受信するには、WebSocketクライアントを作成し、WebSocketサーバーに接続する必要があります。以下に、Pythonを使用したWebSocket APIのサンプルを提供します。
この例では、Pythonのwebsockets
ライブラリを使用してWebSocketクライアントを作成し、サーバーに接続してメッセージを送信および受信します。まず、websockets
ライブラリをインストールします。
pip install websockets
次に、以下のサンプルコードを使用してWebSocketクライアントを作成し、WebSocketサーバーに接続します。このコードは、サーバーに接続し、メッセージを送信して受信する基本的な例です。
import asyncio
import websockets
async def main():
# WebSocketサーバーのURLを指定
websocket_url = 'wss://example.com/websocket-endpoint'
async with websockets.connect(websocket_url) as websocket:
# サーバーにメッセージを送信
await websocket.send("Hello, WebSocket Server!")
# サーバーからのメッセージを受信して表示
response = await websocket.recv()
print(f"Received: {response}")
if __name__ == "__main__":
asyncio.get_event_loop().run_until_complete(main())
このコードでは、websockets
ライブラリを使用してWebSocketサーバーに接続し、メッセージを送信し、サーバーからのメッセージを受信して表示します。websocket_url
をサーバーのWebSocketエンドポイントに置き換え、必要に応じてメッセージをカスタマイズしてください。
WebSocket APIの詳細な情報は、WebSocketサーバーの提供元から提供されるドキュメンテーションや仕様に従ってください。また、WebSocket通信が非同期で行われることに注意してください。
Top 5. Socket
Socketプロトコルは非常に古典的な通信モデルであり、ネットワーク通信プロトコルとしてTCPを使用し、異なるプログラム/コンピュータ間でデータをネットワークを介して送信することを可能にします。Socket通信はリアルタイムかつ双方向の通信方法であり、クライアントとサーバーが持続的な接続を確立した後、両者は随時データの送受信を行うことができます。
WebSocketと異なる点は、Socketがネットワークデータ転送プロセスを完全に制御できる低レベルのネットワークプログラミングインタフェースを提供することです。また、TCPプロトコルを使用するため、Socketはリアルタイム通信、ファイル転送、リモートコントロールなど、さまざまなシナリオで使用できます。
Socket APIのサンプル
Socket APIを使用して簡単なサーバーとクライアントの通信を行うPythonのサンプルを以下に示します。この例では、TCPソケットを使用してテキストメッセージを送信および受信します。
サーバーコード:
import socket
# サーバーのIPアドレスとポート番号を設定
server_ip = "127.0.0.1" # ローカルホストを使用
server_port = 12345
# サーバーソケットを作成
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# サーバーソケットを指定したIPアドレスとポートにバインド
server_socket.bind((server_ip, server_port))
# クライアントからの接続を待機
server_socket.listen(5)
print(f"サーバーは {server_ip}:{server_port} で待機中...")
# クライアントからの接続を受け入れ
client_socket, client_address = server_socket.accept()
print(f"クライアント {client_address} が接続しました")
while True:
# クライアントからデータを受信
data = client_socket.recv(1024).decode("utf-8")
if not data:
break # データが空の場合、ループを終了
print(f"クライアントからのメッセージ: {data}")
# メッセージを大文字に変換してクライアントに送信
response = data.upper()
client_socket.send(response.encode("utf-8"))
# クライアントソケットをクローズ
client_socket.close()
# サーバーソケットをクローズ
server_socket.close()
クライアントコード:
import socket
# サーバーのIPアドレスとポート番号を設定
server_ip = "127.0.0.1" # サーバーのIPアドレス
server_port = 12345
# クライアントソケットを作成
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# サーバーに接続
client_socket.connect((server_ip, server_port))
while True:
# ユーザーからの入力を受け取り、サーバーに送信
message = input("メッセージを入力してください (終了するには 'exit' を入力): ")
client_socket.send(message.encode("utf-8"))
if message == "exit":
break
# サーバーからの応答を受信
response = client_socket.recv(1024).decode("utf-8")
print(f"サーバーからの応答: {response}")
# クライアントソケットをクローズ
client_socket.close()
このサンプルコードでは、サーバーはクライアントからのメッセージを大文字に変換して返します。クライアントはユーザーからのメッセージを入力し、サーバーの応答を表示します。通信を終了するには、クライアント側で "exit" と入力してください。
Top 6. SSE (Server-Sent Events)
サーバー送信イベント(Server-Sent Events、SSE)とは、Webブラウザーとサーバー間の一方向の非同期通信方法のことです。この通信方法では、サーバーがブラウザーに対してイベントをプッシュ送信でき、ブラウザーはサーバーから送信されたイベントを受信して処理できます。
SSEはHTTPプロトコルに基づいているため、サーバーとブラウザー間は長時間接続を維持でき、テキスト形式でデータ送受信を行います。長時間接続でもリソース消費が少ないため、リアルタイムな通信に向いているのが特徴です。
SSEのサンプル
次はPythonを使用してSSE APIの簡単なサーバーサイドとクライアントサイドのサンプルです。
サーバーサイドコード:
from flask import Flask, Response
import time
app = Flask(__name__)
def event_stream():
count = 0
while True:
time.sleep(1) # 1秒ごとにイベントを送信
count += 1
yield f"data: {count}\n\n" # イベントデータを送信
@app.route('/events')
def sse():
return Response(event_stream(), mimetype='text/event-stream')
if __name__ == '__main__':
app.run(debug=True)
このサーバーサイドコードは、Flaskを使用してSSEストリームを提供します。/events
エンドポイントにアクセスすると、1秒ごとに新しいイベントデータが送信されます。
クライアントサイドHTML:
<!DOCTYPE html>
<html>
<head>
<title>SSE Example</title>
</head>
<body>
<h1>Server-Sent Events Example</h1>
<div id="sse-data"></div>
<script>
const eventSource = new EventSource("/events");
eventSource.onmessage = function(event) {
const sseData = document.getElementById("sse-data");
sseData.innerHTML = `Received data: ${event.data}<br>` + sseData.innerHTML;
};
eventSource.onerror = function(event) {
console.error("SSE Error:", event);
};
</script>
</body>
</html>
このHTMLファイルは、SSEデータを表示するためのシンプルなウェブページです。<div id="sse-data"></div>
要素は、受信したSSEデータを表示するための場所です。JavaScript部分では、EventSource
オブジェクトを使用してSSEストリームを購読し、データを受信したときに表示します。
サーバー側でコードを実行し、クライアント側でHTMLファイルをブラウザで開いて実行すると、1秒ごとに新しいデータが表示されることがわかります。これにより、サーバーからクライアントへのリアルタイムなイベント送信が実現されます。
Top 7. gRPC (gRPC Remote Procedure Call)
gRPCは、Googleが開発したオープンソースの高性能なリモートプロシージャコール(RPC)フレームワークです。簡単に言うと、gRPCの「g」はGoogleのことを指していて、Googleが開発したRPCのことになります。
gRPCは、Protocol Buffers(protobuf)というシリアライゼーション形式を使用して、クライアントとサーバー間の効率的な通信を可能にします。クライアントとサーバーの間でストリームや双方向通信をサポートすることができます。また、多言語に対応しており、さまざまなプログラミング言語で使用することができます。
上図からわかるように、gRPCでリモート手続き呼び出しを行う場合、クライアントはgRPC Stubだけが必要で、Proto Requestを通じてgRPC Serverにサービスの呼び出しを開始し、gRPC ServerはProto Response(s)を通じて呼び出し結果をクライアントに返します。
Top 8. MsgPack (MessagePack)
MessagePack(MsgPack)とは、MessagePackは、効率の良いバイナリ形式のオブジェクト・シリアライズ フォーマットです。JSONの置き換えとして使うことができ、様々なプログラミング言語をまたいでデータを交換することが可能です。しかも、JSONよりも速くてコンパクトです。例えば、小さな整数値はたった1バイト、短い文字列は文字列自体の長さ+1バイトでシリアライズできます。
MsgPack APIのサンプル
以下は、Pythonを使用したMsgPack APIの簡単なサンプルです。
インストール:
まず、PythonのMsgPackライブラリをインストールします。
pip install msgpack
サンプルコード:
import msgpack
# PythonデータをMsgPackにエンコード
data_to_encode = {
'name': 'Alice',
'age': 30,
'is_student': False,
'scores': [95, 88, 78]
}
# データをMsgPackバイナリにエンコード
msgpack_data = msgpack.packb(data_to_encode)
# MsgPackバイナリをデコードしてPythonデータに戻す
decoded_data = msgpack.unpackb(msgpack_data, raw=False)
# デコードされたデータを表示
print("Decoded Data:", decoded_data)
このサンプルでは、Pythonデータ(辞書)をMsgPackにエンコードし、エンコードされたデータをMsgPackバイナリとして保存します。その後、MsgPackバイナリをデコードして元のPythonデータに戻し、デコードされたデータを表示します。
Apidog:すべてのプロトコルにもご対応
Apidogは、多数のプロトコルにも対応可能なAPI管理ツールになります。REST API、GraphQL API、WebSocket APIを作成したり、テストしたりする必要がある場合でも、Apidogは役に立ちます。
Apidogは、APIの設計、開発、テスト、仕様書生成と共有などの機能をも備えており、非常に完全のAPI管理ソリューションになります。そこで、どのプロトコルを採用しているAPIを効率よく管理したい場合、Apidogは適切なツールになれるのでしょう。