Apidog

オールインワン協働API開発プラットフォーム

API設計

APIドキュメント

APIデバッグ

APIモック

API自動テスト

APIプロトコルとは?APIプロトコルTop 8をご紹介!

HTTPの実質はプロトコールの一種になります。主流となっているRESTやSOAPなどのAPIもHTTPプロトコルを採用しています。本文では、API技術とAPIプロトコルをより深く探索して、世界中で広く利用されているAPIプロトコルTop 8をまとめて皆さんに紹介していきたいと思います。

中村 拓也

中村 拓也

Updated on 11月 12, 2024

皆さんもHTTPをよく耳にしているのでしょう。HTTPの実質はプロトコールの一種になります。現在のインターネットでは、大部のデータ交換プロセスは、HTTPというプロトコルに基づいて行われています。APIの面から見ても、HTTPプロトコルをベースにして設計されているものも少なくありません。主流となっているRESTやSOAPなどもHTTPプロトコルを採用しています。

本文では、API技術とAPIプロトコルをより深く探索して、世界中で広く利用されているAPIプロトコルTop 8をまとめて皆さんに紹介していきたいと思います。また、Apidogは、主流のAPIプロトコルにも対応可能なAPI管理ツールになります。異なるタイプのAPIを一括に管理したい場合は、Apidogを試してください。

button

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プロトコルを確認することができます。

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を使って特定の書籍を削除
RESTful APIの構造図

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
SOAPプロトコルとは?SOAP APIをテストするには?
SOAPという通信プロトコルとはなんですか?SOAP通信プロトコルを利用しているAPIをテストするにはどうしたらいいですか?本文では、SOAPについて詳しく皆さんに解説した上、SOAP APIの単体テストを行う方法を紹介します。

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)とは、それを実装する方法は?
サーバー送信イベント(Server-Sent Events、SSE)とは、Webブラウザーとサーバー間の一方向の非同期通信方法のことです。最近、サーバー送信イベントは、リアルタイム通信の実現によく利用されています。本文では、サーバー送信イベントを詳しく解説した上、それを実現する方法を皆さんに紹介します。

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でリモート手続き呼び出しを行う場合、クライアントはgRPC Stubだけが必要で、Proto Requestを通じてgRPC Serverにサービスの呼び出しを開始し、gRPC ServerはProto Response(s)を通じて呼び出し結果をクライアントに返します。

Top 8. MsgPack (MessagePack)

MessagePack(MsgPack)とは、MessagePackは、効率の良いバイナリ形式のオブジェクト・シリアライズ フォーマットです。JSONの置き換えとして使うことができ、様々なプログラミング言語をまたいでデータを交換することが可能です。しかも、JSONよりも速くてコンパクトです。例えば、小さな整数値はたった1バイト、短い文字列は文字列自体の長さ+1バイトでシリアライズできます。

MessagePackとは|おすすめのMsgPack対応のAPIクライアント
Messagepackは、効率の良いバイナリ形式のオブジェクト・シリアライズフォーマットとして、データ交換をより効率的にしています。本文では、MessagePackの基本情報を紹介した上、MsgPack対応のAPIクライアントを使って、サーバー間でより効率的なデータ通信を行える方法を皆さんに紹介します。

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データに戻し、デコードされたデータを表示します。

button

Apidog:すべてのプロトコルにもご対応

Apidogは、多数のプロトコルにも対応可能なAPI管理ツールになります。REST API、GraphQL API、WebSocket APIを作成したり、テストしたりする必要がある場合でも、Apidogは役に立ちます。

apidogのインタフェース

Apidogは、APIの設計、開発、テスト、仕様書生成と共有などの機能をも備えており、非常に完全のAPI管理ソリューションになります。そこで、どのプロトコルを採用しているAPIを効率よく管理したい場合、Apidogは適切なツールになれるのでしょう。

button
初心者必見!JavaのListと配列の基本と使い方観点

初心者必見!JavaのListと配列の基本と使い方

JavaのListは、柔軟で効率的なデータ操作を実現するための重要なクラスです。ArrayListやLinkedListを上手に使い分けることで、さまざまなシチュエーションに適したデータ処理が可能です。初心者でも基本的な使い方を学べば、データ操作を効率的に行えるようになります。

中村 拓也

12月 18, 2024

Base64とは?バイナリデータのエンコードとその使い方観点

Base64とは?バイナリデータのエンコードとその使い方

Base64は、バイナリデータをASCII文字列に変換する方法で、主に電子メールの添付ファイルやWebでの画像データ転送、APIでのデータ送信に使用されます。Base64エンコードによりデータの取り扱いが簡単になりますが、データサイズが約33%増加するため、注意が必要です。

中村 拓也

12月 18, 2024

INNER JOINを使いこなす:複数テーブルのデータ統合観点

INNER JOINを使いこなす:複数テーブルのデータ統合

INNER JOINは、複数のテーブルから関連するデータを結びつけ、より豊富な情報を得るために使用されます。非常に強力な機能であり、複雑なクエリを作成する際に欠かせない要素です。INNER JOINを適切に使い分けることで、効率的なデータ取得が可能になります.

中村 拓也

12月 12, 2024