👁️

APIとは

2025/03/11に公開

APIの紹介

アプリケーションを開発する際、プログラミング言語だけで全ての機能や制御を実装するわけではありません。既に誰かによって提供されている機能を呼び出して、処理を実現します。こうしたあらかじめ用意された機能群を、APIと呼びます。本記事ではWeb API、ソフトウェアAPI、ライブラリAPIの各種類について、概要と具体例を交えて紹介します。
API Intro

(中央)ネジがAPI、
(右)鋳造所がAPI提供者、
(左)時計技術者がAPI利用者、
のイメージです。

WebAPI

インターネット(Web)を介して利用可能なAPIをWeb APIといいます。たとえば、サーバーからデータを取得するアプリや、Twitter(X)やLINEのボットなどはWeb APIを活用して実装されています。WebAPIを利用する理由は以下の通りです。

  • データの一元管理
    遠隔サーバーにデータを保存・取得できる機能を提供することで、どのパソコンからでも同じサーバーにアクセスしてデータを管理できます。
  • 処理能力の分散
    遠隔の高性能コンピューターで処理を実行することにより、個人パソコンの負荷を軽減したり、個人では実現困難な高度な処理(例:AIやLLMを用いた計算)を可能にします。

WebAPIの利用方法

インターネットを介してAPIを利用するには、URLを指定してアクセスします。大抵、HTTPという統一された通信ルールに従いデータを送受信します。

  • Javascriptの場合:
// JSONPlaceholderの/postsエンドポイントにGETリクエストを送信
fetch('https://jsonplaceholder.typicode.com/posts')
  .then(response => {
    // レスポンスがOK(200-299)であるか確認
    if (!response.ok) {
      throw new Error('Network response was not ok');
    }
    // レスポンスをJSONとしてパース
    return response.json();
  })
  .then(data => {
    // 取得したデータをコンソールに表示
    console.log(data);
  })
  .catch(error => {
    // エラーが発生した場合にエラーメッセージを表示
    console.error('There was a problem with the fetch operation:', error);
  });
  • Pythonの場合:
import requests

# JSONPlaceholderの/postsエンドポイントにGETリクエストを送信
response = requests.get('https://jsonplaceholder.typicode.com/posts')

# レスポンスのステータスコードが200(OK)であるか確認
if response.status_code == 200:
    # レスポンスをJSONとしてパース
    data = response.json()
    # 取得したデータを表示
    print(data)
else:
    # エラーが発生した場合にエラーメッセージを表示
    print(f'Error: {response.status_code}')

WebAPIの提供方法

Web APIは、サーバー側で設計・実装されたサービスとして提供され、クライアントはHTTPリクエストを通じてその機能にアクセスできます。以下は、Web API提供時の主なポイントです。

  • エンドポイントの設計
    APIは、URL(エンドポイント)ごとに機能やリソースを分割して提供されます。RESTful APIの場合、リソースに対する操作はHTTPメソッド(GET、POST、PUT、DELETEなど)で表現され、分かりやすいURI設計が求められます。
  • 処理内容の実装
    リクエストに対して内部で処理を行なったり、さらにレスポンスを返したりなどします。

実際のHTTPサーバーの実装例は以下の通りです。

  • javascript:
const http = require('http'); // httpモジュールの読み込み
const port = 3000; // サーバがリッスンするポート番号

// サーバの作成。リクエストが来た際にコールバックが実行される
const server = http.createServer((req, res) => {
  // ステータスコード200(成功)とテキストプレーン形式を設定
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  // レスポンスボディとして"Hello, World!"を返す
  res.end('Hello, World!\n');
});

// 指定したポートでサーバを起動し、起動完了時にメッセージを表示
server.listen(port, () => {
  console.log(`Server running at http://localhost:${port}/`);
});
  • Go:
package main

import (
	"fmt"
	"net/http"
)

// ルートパスに対するハンドラ関数
func helloHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintln(w, "Hello, World!")
}

func main() {
	// ルートパスに対してハンドラを登録
	http.HandleFunc("/", helloHandler)
	
	port := "3000"
	fmt.Printf("Server running at http://localhost:%s/\n", port)
	
	// 指定したポートでサーバを起動
	if err := http.ListenAndServe(":" + port, nil); err != nil {
		fmt.Println("Error starting server:", err)
	}
}

API Key

Web APIを利用すると、遠隔のコンピューターで処理が実行されるため、過剰なアクセスがサーバーに負荷をかける恐れがあります。そこで、APIへのアクセスを制限するために「API Key」と呼ばれる鍵が用いられます。API Keyの主な役割は以下の通りです。

  • 認証
    API Keyを用いて、利用するアプリケーションやユーザーが正当であるか確認し、アクセスを許可します。API Keyがない、または無効な場合はアクセスが拒否されます。
  • アクセス制御
    API Keyごとに利用可能な機能やリクエスト回数(レートリミット)を設定することで、過剰な利用や不正使用を防ぎます。
  • 使用状況の追跡
    誰がどれだけAPIを利用しているかを記録し、監視や分析、必要に応じた請求に役立てます。

API Keyを用いるAPIの例でいうと以下のものがあります。

  • Google Maps API
  • Twitter API(X API)

ソフトウェアAPI

ソフトウェアAPIは、特定のソフトウェアで提供されている機能の内、外部からアクセスできるもののことです。これにより、アプリケーション内部の機能を外部プログラムから利用することが可能になります。ソフトウェアAPIは、特定のプラットフォームやフレームワークに依存する場合が多く、各環境に応じたアプリ開発を支援します。

ソフトウェアAPIの利用方法

ソフトウェアごとにAPIがあるので代表的なものは以下の通りです。

Windows API

Microsoft WindowsOSが提供するAPIで、ウィンドウの作成やファイル操作などを行えます。例えば、独自のデスクトップアプリでファイル保存ダイアログを表示できます。

#include <windows.h>

int main() {
    MessageBox(NULL, "Hello, World!", "Message", MB_OK);
    return 0;
}

ブラウザー API

Webブラウザー(例:Google Chrome、Safari)もソフトウェアであり、各ブラウザーは独自のAPIを提供しています。これにより、アプリケーションの機能強化やユーザー体験の向上が図れます。代表的なブラウザーAPIは以下の通りです。

  • Console API:
// 基本的なログ出力
console.log('Hello, World!');
  • Fetch API:
    ネットワークリソースを非同期で取得するためのAPIです。HTTPリクエストを送信し、レスポンスを処理するのに使用されます。
// JSONPlaceholderから投稿データを取得
fetch('https://jsonplaceholder.typicode.com/posts')
  .then(response => {
    if (!response.ok) {
      throw new Error('Network response was not ok');
    }
    return response.json();
  })
  .then(data => {
    console.log(data);
  })
  .catch(error => {
    console.error('Fetch error:', error);
  });
  • WebSocket API:
    ブラウザーとサーバー間で双方向のリアルタイム通信を可能にするAPIです。接続を維持するため、チャットアプリやリアルタイムゲームなどの用途に適しています。
// WebSocket接続の作成
const socket = new WebSocket('wss://echo.websocket.org');

// 接続が開いたときの処理
socket.addEventListener('open', (event) => {
  console.log('WebSocket接続が開きました');
  socket.send('Hello, Server!');
});

// メッセージ受信時の処理
socket.addEventListener('message', (event) => {
  console.log('サーバーからのメッセージ:', event.data);
});

// 接続が閉じたときの処理
socket.addEventListener('close', (event) => {
  console.log('WebSocket接続が閉じました');
});

// エラー発生時の処理
socket.addEventListener('error', (event) => {
  console.error('WebSocketエラー:', event);
});

APIの使い方であったり、各ブラウザにおける対応状況は以下のサイトで確認することができます。
MDN

ブラウザ間で同じ設計になるようAPIには仕様がありますが、ブラウザごとに実装進度により、使えないAPIがちらほらあります。実装進度は以下のサイトで確認できます。
Can I Use

ソフトウェアAPIの提供方法

ソフトウェアを開発し、特定経路でのみ機能にアクセスできるようにすると公開できます。
例えばブラウザなどではjavascriptでブラウザのAPIを利用することでブラウザの機能にアクセスできるようになっています。

ライブラリのAPI

ライブラリとは、特定のプログラミング言語で書かれた再利用可能なコードの集まりのことです。コードを再利用することによって、効率的に抽象的に処理を記述できます。そのライブラリの中で、外部から再利用できる部分もまたAPIです。

ライブラリのAPIの利用方法

  • NumPy:
    NumPyは、科学技術計算に特化したライブラリで、多次元配列の操作や数学的計算を効率的に行うためのAPIを提供します。
import numpy as np

# 1次元配列の作成
arr = np.array([1, 2, 3, 4, 5])

# 配列の要素の合計を計算
total = np.sum(arr)
print("Sum:", total)

# 2次元配列(行列)の作成
matrix = np.array([[1, 2, 3], [4, 5, 6]])

# 行列の転置
transposed = np.transpose(matrix)
print("Transposed Matrix:\n", transposed)
  • React:
    ReactはJavaScriptを使ったのUI構築のためのライブラリで、Javascriptを用いてReactのAPIを利用すると、UI/UX、画面描画の処理を簡単に実行できます。
import React, { useState } from 'react';

function App() {
  // useStateフックで状態を管理
  const [count, setCount] = useState(0);

  return (
    <div>
      <h1>カウンター: {count}</h1>
      <button onClick={() => setCount(count + 1)}>カウントアップ</button>
    </div>
  );
}

export default App;

ライブラリのAPIの提供方法

  • javascript:
    javascriptではexportというフレーズを先頭に着けると、その部分が外部に公開され、外部ファイルから利用可能になるのでライブラリのAPIとして利用できます。exportがついていない物は同ファイル内でのみ参照可能なAPIになります
// 公開されていないAPI
function name() {
    return "your name"
}

// 公開されているAPI
export function add(a, b) {
    return a + b
}
//利用時
import add from "/path/to/lib"

add(1, 1) // = 2
  • Go:
    Go言語では大文字で始まる関数(Add)は外部からアクセス可能になるのでライブラリのAPiとなります。
package lib
// 公開されていないAPI
func name() string {
    return "your name"
}

// 公開されているAPI
func Add(a, b int) int {
    return a + b
}
import "path/to/lib"

lib.Add(1, 1) // = 2

APIについて

さいごにAPIとはApplication Programming Interfaceの略で、直訳で「アプリケーション 実装 境界」となり、つまり「アプリを実装するためにアクセスできる機能」という意味になります。
他の似た用語(ライブラリ、ツール、SDK)との違いでいうと、APIは機能とその見え方に重点をおくときに使われるイメージです。

ネジでいえば、機能:ものを繋ぐ、見え方:穴の形といった感じです。

APIの意義

APIは、開発者が既存の機能やデータを活用して新しいアプリケーションを迅速に構築できる仕組みです。たとえば、Web APIを利用すれば天気予報アプリを手軽に開発でき、ライブラリAPIを使えば複雑な計算も短いコードで実現できます。APIは「ブラックボックス」として内部実装を隠蔽するため、開発者は自身のアプリケーションのロジックに集中できます。

コード設計

大規模な開発では、コードの可読性や保守性の観点から、どのようにAPIを設計・提供するかが重要になります。特にチーム開発では、メンバーが使いやすいAPIを整備し、公開することが求められます。また、ライブラリ開発においては、多くの利用者にとって使いやすいAPI設計が成功の鍵になります。

さいごに

今回はAPIについてのまとめでした!
APIと言われるとWebAPIのことを指すことが多く、自分もWebAPIを使ったり作ったりすることしかなかったので、API<-WebAPIと思っていました。しかし、ライブラリを開発していくうちに、その文脈でもAPIがあることを知ったので、まとめてみました。
ソフトウェアやライブラリという文脈でのAPIを自分の中で整理できてよかったです。🧐

Discussion