API同士がどうやって"会話"するの?

APIが"会話"するって、どういう意味でしょうか?APIは、リクエストとレスポンスを通じて会話します。APIはエンドポイントを公開してリクエストを受け付け、レスポンスを返します。API同士が会話するには、あるAPIがクライアントとして他のサーバーAPIにリクエストを行います。

そして、そのサーバーAPIがこれらのリクエストにレスポンドします。このコミュニケーションには、HTTPといった標準のインターネットプロトコルと、JSONのような標準のデータ形式が使われます。APIは、リクエストやレスポンスがどうあるべきかについて合意します。

さて、もう少し具体的に見てみましょう。APIとは何でしょうか?APIとは、アプリケーションプログラミングインターフェースの略で、実質的にはアプリケーション同士のコミュニケーション方法です。

ここで言う「アプリケーション」とは、特定の目的を持ったソフトウェアのことで、「インターフェース」とは、2つのアプリケーションがどのように相互作用するかに関する合意を意味します。

すべてをまとめると、APIは異なるアプリケーション間でコミュニケーションを行い、リソースを共有する手段を提供します。基本的に、システムのワークフロー内で「中間者」として常にリクエストを仲介し、必要に応じてデータを提供します。

では、実際のコミュニケーションはどのように行われるのでしょうか?簡単なシナリオを共有しましょう。eBayやAmazonで素敵な人間工学に基づいたキーボードを見つけて注文します。

しかし、数分後、やっぱり必要ないと気づき、注文をキャンセルすることにします。このシナリオは、APIがどのように機能するかを反映しています。つまり、注文を受け取る人があなたのAPIです。

APIは注文リクエストを処理し、eコマースプラットフォームのバックエンドシステムとコミュニケーションを行います。注文をキャンセルすることにした場合、APIはそのリクエストも処理し、適切なバックエンドシステムと対話して注文をキャンセルします。

APIはどうやって動くの?

APIのサイクルは次のように機能します。サーバーはデータを保存し処理するバックエンドシステムです。ユーザーがブラウザを通じてリクエストを行うと、ブラウザがリクエストをAPIに送信します。

APIがリクエストを受け取り、ユーザーにデータを取得するためにサーバーを呼び出します。そしてAPIはデータをブラウザに送り返し、そこでユーザーに表示されます。

例えば;

ブラウザであなたのプロフィールデータをロードするためのボタンをクリックするとします。これにより、APIに対するGETリクエストがトリガーされます。

GET /api/users/elliot HTTP/1.1
Host: www.example.com

APIはリクエストを受け取り、ユーザーelliotのデータを取得するためにサーバーを呼び出します。

GET /elliot/1234
Authorization: Bearer api_key

その後、サーバーはElliotのデータをデータベースから取得し、APIに返送します。

{
  "name": "Elliot",
  "email": "elliotbrenyasarfo@gmail.com",
  "address": "Ghana Tema Community 19"
}

最後に、APIは元のGETリクエストへのレスポンスとしてデータをパッケージ化し、ブラウザに送り返します。

HTTP/1.1 200 OK
Content-Type: application/json
{
  "name": "Elliot",
  "email": "elliotbrenyasarfo@gmail.com",
  "address": "Ghana Tema Community 19"
}

ブラウザはそれからElliotのユーザープロフィールデータを表示します。

API通信における認証と承認

API認証

API認証は、APIに接続するクライアントの身元を検証するプロセスです。信頼できるソースからのリクエストだけが発信されていることを保証します。認証は非常に重要です。なぜなら、APIは多くの場合、機密データや機能にアクセスを提供するからです。

知っておくべき認証キーワード

Credentials (クレデンシャル) - ユーザーを識別するために使う、ユーザー名/パスワードのような詳細。

Tokens (トークン) - ユーザーの身元を表す、ユニークな文字列。

Authorization (承認) - 認証されたユーザーにリソースへのアクセスを許可するプロセス。

APIリクエストを認証するために使われる方法

  • API Keys(API キー)
  • Basic Auth(ベーシック認証)
  • OAuth 2.0
  • OpenID Connect
  • JSON Web Tokens (JWT)
  • Two Factor Auth(2要素認証)

API承認

API承認は、認証後のリソースへのアクセスを制御します。例えば、ユーザーAはデータの読み取り権限を持っているかもしれませんが、ユーザーBはデータの編集もできるかもしれません。

API承認がどのように強制されるか

  • 特定の権限を定義するスコープ。
  • 誰がさまざまなAPIリソースにアクセスできるかを統制するアクセスコントロールポリシー。
  • ロールベースのアクセスコントロール(RBAC)システム。

まだわかりにくい場合でも心配無用です。簡単に言うと、API承認はアクセスの乱用や権限昇格攻撃を防止します。承認は、認証の対策とともに、細かいアクセス制御を提供します。

ベストプラクティスと一般的な落とし穴

これらのベストプラクティスを守り、一般的な落とし穴を意識することで、開発者は機能的で信頼性があり、セキュアでユーザーフレンドリーかつ効率的なAPIを作成できます。

APIリクエストにおけるエラー処理

開発者にとって、エラーを予期して効率的に管理することは、APIの信頼性を確保し、サービスの質を高めるために不可欠です。

以下は、RESTful APIリクエストにおけるエラー処理を示すPythonのコードスニペットの拡張されたコンテキストです:

import requests
def api_request(url):
    try:
        response = requests.get(url)
        response.raise_for_status()
    except requests.exceptions.HTTPError as http_err:
        print(f'HTTP error occurred: {http_err}')
    except Exception as err:
        print(f'Other error occurred: {err}')
    else:
        return response.json()

使用例

api_response = api_request('https://api.example.com/data')

ここでは、try-exceptブロックを使用して、予期しないエラーやその他の例外が起きた場合に対処し、問題に対して適切に対応します。

レート制限
レート制限は、APIを過度な使用から守るだけでなく、ユーザー間の公平な使用ポリシーを維持するのに役立ちます。APIが高いトラフィックに直面するシナリオでは特に重要で、すべてのユーザーにとってサービスが中断されず、信頼できる状態を保つことができます。

データ管理
これは、どのデータを保存し、どのくらいの頻度でアクセスする必要があるか、どのような形でアクセスするかを知ることを意味します。データベースクエリを最適化することも遅延を減らし、API全体のパフォーマンスを向上させるために不可欠です。これにはインデックス作成、適切なスキーマ設計、適宜キャッシングメカニズムの利用などの手法が含まれます。

ドキュメンテーションとユーザビリティ
良いドキュメンテーションは単なるアクセサリではなく、任意のAPIにとって必需品です。文書化されたAPIは使用や統合が容易で、採用されやすくなります。ドキュメントはユーザーフレンドリーであり、APIの変更を反映するために常に最新の状態に保つ必要があります。

バージョニング戦略
APIは時間とともに進化します。これらの変更を管理することは重要です。バージョニングを通じて、既存のAPIユーザーを混乱させずに変更や改善を導入することができます。セマンティックバージョニングは一般的な方法で、バージョン番号ごとに変更の性質(メジャー、マイナー、パッチ)を示します。

非推奨の取り扱い
非推奨では、ユーザーに十分な前もって変更について通知し、明確な移行パスを提供し、遷移期間中のサポートを保証することが不可欠です。ユーザーの信頼を維持し、混乱を最小限に抑えるために、非推奨は慎重に扱われるべきです。

パフォーマンスの最適化
機能性のみならず、APIのパフォーマンスも重要です。これには、レスポンス時間の最適化や、同時リクエストの効率的な処理が含まれます。ロードバランシング、リソースの効率的な使用、依存関係の最小化などの手法は、APIのパフォーマンスを大幅に向上させることができます。

セキュリティへの配慮
APIのセキュリティは言うまでもなく重要です。これには、インジェクションなどの一般的な脆弱性に対する配慮、強力な認証と承認プロトコルの実装、データ暗号化の確保などが含まれます。定期的なセキュリティ監査とAPIセキュリティのベストプラクティスの遵守は、機密データを保護し、ユーザーの信頼を維持するために基本的です。

結論

技術の急速な発展が続く中、APIの役割はますます重要になっています。開発者のためのツールから、さまざまなセクターでのテクノロジーの統合と利用のしかたを表す、より幅広いシフトへと移っています。

こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/apitoolkit/how-do-apis-speaks-to-each-other-5c9l