メインコンテンツへスキップ
見出し画像

愛(AI)と共に:✍️APIを実際に作り、使用する⛏️🧠AIの組み込みで活用はしてたけど😅

    まずはAPIの基本的な考え方からおさらいします。

    その後は、APIを実際に作って、利用してみます。
    色々とイメージが湧き易いようにサーバー側になるAPIプログラムは3種類くらい書いてみます。
    クライアントはHTMLで記述するのが分かり易そうです。

    そんな流れで話を進めていこうと思います。
    意外と「仕様書」が重要そうです。



    🟢APIとは?

    **API(Application Programming Interface)**とは、

    「あるプログラムの機能を、他のプログラムから決められたルールで利用するための窓口」

    のことです。

    人間で例えると、APIはレストランの店員のような存在です。

    • あなた(利用するプログラム)が注文する

    • 店員(API)が厨房へ伝える

    • 厨房(サーバーや別のプログラム)が料理を作る

    • 店員(API)が料理を持ってくる

    あなたは厨房の作り方を知る必要はなく、「メニュー(APIの仕様)」だけ知っていれば注文できます。


    APIが必要な理由

    例えば天気アプリを作るとします。

    天気データを自分で観測するのは大変なので、

    天気アプリ
          │
          │ API
          ▼
    気象サービス
    

    という形で、気象サービスが提供するAPIからデータを受け取ります。

    これにより、

    • データを自分で管理しなくていい

    • 常に最新情報を取得できる

    • 開発がとても楽になる

    というメリットがあります。


    APIは「約束事」

    APIには「こういう形式で送ってください」というルールがあります。

    例えば

    GET /weather?city=Tokyo
    

    というリクエストを送ると、

    {
      "city": "Tokyo",
      "temperature": 31,
      "weather": "Sunny"
    }
    

    というデータが返ってきます。

    つまり

    • どこに送るか(URL)

    • 何を送るか

    • どんな形式で返ってくるか

    が決められています。


    APIはPC同士の会話

    実際には次のような流れになります。

    PC①(クライアント)
    
    「東京の天気を教えて」
    
            │
            │ HTTP通信
            ▼
    
    PC②(サーバー)
    
    「東京は31℃、晴れです」
    
            ▲
            │
            │ JSONデータ
            │
    
    PC①
    

    この「問い合わせ」と「返事」の仕組みがAPIです。


    APIは同じPC内でも使われる

    APIというとインターネットを思い浮かべがちですが、同じPC内でも使われます。

    例えば

    Excel
       │
       │ API
       ▼
    Windows
    

    Excelが

    • ファイルを開く

    • 印刷する

    • ウィンドウを表示する

    といった操作をするときは、Windowsが提供するAPIを利用しています。

    つまりAPIは、

    • PCとPC

    • プログラムとプログラム

    • アプリとOS

    など、さまざまな場面で使われています。


    APIを一言でまとめると

    APIとは、

    「プログラム同士が決められたルールに従って機能やデータをやり取りするための窓口」

    です。

    重要なのは、「内部の仕組みを知らなくても、使い方(ルール)さえ守れば利用できる」という点です。


    次は、実際に2台のPCがHTTP APIを使ってどのようなメッセージを送受信するのかを、リクエスト・レスポンスの具体例(HTTPメッセージやJSONを含む)で順を追って見ていきましょう。そうすると、API通信のイメージがかなり具体的になります。



    🔴「お天気API」を作ってみる

    実際のAPI開発では、次の流れになることが多いです。

    ① APIの仕様を決める
            ↓
    ② サーバー(API)を作る
            ↓
    ③ クライアント(Webやアプリ)を作る
            ↓
    ④ 動作確認・改善
    

    今回は学習用なので、固定のデータを返すAPIにすると仕組みだけに集中できます。


    今回作るもの

                 HTTP
    
    ┌────────────────────┐
    │ クライアント        │
    │ HTML(JavaScript)   │
    └────────┬───────────┘
             │ GET /weather
             ▼
    ┌────────────────────┐
    │ APIサーバー        │
    │ Python / Go / Java │
    └────────┬───────────┘
             │
             ▼
    JSONを返す
    

    返すデータは共通です。

    {
        "weather": "晴れ",
        "temperature": 30,
        "humidity": 65,
        "datetime": "2026-07-07 10:30:00"
    }
    

    サーバーだけ言語を変えます。

    • Python → 晴れ

    • Go → 曇り

    • Java → 雨

    こうすると「APIは言語が違っても使い方は同じ」がよく分かります。


    ① API仕様

    まず仕様を決めます。

    URL

    GET /weather
    

    レスポンス(JSON)

    {
        "weather": "晴れ",
        "temperature": 30,
        "humidity": 65,
        "datetime": "2026-07-07 10:30:00"
    }
    

    これがAPIの約束になります。
    ちなみに「仕様書」風にまとめると下記のようになります。
    項目:内容
    URL:/weather
    メソッド:GET
    レスポンス形式:JSON
    weather:天気(文字列)
    temperature:気温(整数)
    humidity:湿度(整数)
    datetime:サーバーの現在日時(文字列)


    ② Python(APIサーバー)

    Flaskを使います。

    from flask import Flask, jsonify
    
    app = Flask(__name__)
    
    @app.route("/weather")
    def weather():
        return jsonify({
            "weather": "晴れ",
            "temperature": 30,
            "humidity": 65,
            "datetime": "2026-07-07 10:30:00"
        })
    
    app.run(debug=True)
    

    アクセスすると

    http://localhost:5000/weather
    

    ↓

    {
        "weather":"晴れ",
        "temperature":30,
        "humidity":65,
        "datetime":"2026-07-07 10:30:00"
    }
    

    ③ Go(APIサーバー)

    package main
    
    import (
        "encoding/json"
        "net/http"
    )
    
    type Weather struct {
        Weather    string `json:"weather"`
        Temperature int   `json:"temperature"`
        Humidity    int   `json:"humidity"`
        Datetime    string `json:"datetime"`
    }
    
    func weatherHandler(w http.ResponseWriter, r *http.Request) {
        data := Weather{
            Weather: "曇り",
            Temperature: 27,
            Humidity: 72,
            Datetime: "2026-07-07 10:30:00",
        }
    
        w.Header().Set("Content-Type", "application/json")
        json.NewEncoder(w).Encode(data)
    }
    
    func main() {
        http.HandleFunc("/weather", weatherHandler)
        http.ListenAndServe(":8080", nil)
    }
    

    ④ Java(APIサーバー)

    例えばSpring Bootなら

    @RestController
    public class WeatherController {
    
        @GetMapping("/weather")
        public Map<String, Object> weather() {
    
            Map<String, Object> map = new HashMap<>();
    
            map.put("weather", "雨");
            map.put("temperature", 24);
            map.put("humidity", 88);
            map.put("datetime", "2026-07-07 10:30:00");
    
            return map;
        }
    }
    

    ⑤ クライアント(HTML)

    個人的な趣味もありますが、教育や学用には”HTML”がおすすめです。

    理由としては

    • APIだけに集中できる

    • Pythonなどの言語で書く必要がない(むしろ二度手間)

    • JavaScriptのfetch()がAPIそのものだから

    index.html

    <!DOCTYPE html>
    <html lang="ja">
    <head>
    <meta charset="UTF-8">
    <title>天気情報</title>
    </head>
    
    <body>
    
    <h1>天気情報</h1>
    
    <p>天気:<span id="weather"></span></p>
    <p>気温:<span id="temp"></span>℃</p>
    <p>湿度:<span id="hum"></span>%</p>
    <p>日時:<span id="dt"></span></p>
    
    <script>
    fetch("http://localhost:5000/weather")
        .then(response => response.json())
        .then(data => {
    
            document.getElementById("weather").textContent = data.weather;
            document.getElementById("temp").textContent = data.temperature;
            document.getElementById("hum").textContent = data.humidity;
            document.getElementById("dt").textContent = data.datetime;
    
        });
    </script>
    
    </body>
    </html>
    

    ブラウザはサーバーに

    GET /weather
    

    を送り、

    PythonサーバーからJSONを受け取り、

    画面へ表示します。


    通信の流れ

    HTML(JavaScript)
    
    fetch("/weather")
    
            │
            │ HTTP GET
            ▼
    
    Python Flask
    
    {
     weather:"晴れ",
     temperature:30,
     humidity:65,
     datetime:"..."
    }
    
            │
            │ JSON
            ▼
    
    HTML
    
    画面へ表示
    

    GoでもJavaでも全く同じです。
    クライアント(HTML)のポート番号だけ書き換えてください。



    🔵この教材をさらに面白くするアイデア

    先に紹介した3、3つのAPIサーバーを同時に動かし、クライアントから切り替えて呼び出す構成も考えてみました。

    Python(API)  localhost:5000
           │
    Go(API)      localhost:8080
           │
    Java(API)    localhost:8081
           │
           ▼
    HTML
    
    「Python」ボタン
    「Go」ボタン
    「Java」ボタン
    

    ボタンを押すたびに、それぞれのAPIから天気情報を取得して表示します。

    この構成だと、

    • APIの仕様(JSON)が同じなら、実装言語が違ってもクライアントはほとんど変更不要

    • サーバーとクライアントが独立して開発できる

    • 「APIは契約(仕様)が重要」という考え方

    を実際に体験できます。

    あと、せっかくなので、一部は固定値ではなく「現在時刻だけはサーバーで毎回生成する」といった機能を少し追加してみます。
    この流れだと、実務で使われるAPIの設計に自然につながり、学べる内容が一気に増えます。

    • APIの設計(JSON形式を統一)

    • サーバー側の処理(日時を毎回生成)

    • クライアント側の処理(APIを切り替えて呼び出す)

    • HTTP通信

    • JSON

    • 異なる言語でも同じAPIなら同じクライアントで利用できる

    全体構成は次のようになります。

                      ブラウザ
    
            ┌─────────────────────┐
            │ 天気表示            │
            │                     │
            │ [Python] [Go] [Java]│
            │                     │
            │ 天気:              │
            │ 気温:              │
            │ 湿度:              │
            │ 日時:              │
            └─────────┬───────────┘
                      │
          ┌───────────┼────────────┐
          │           │            │
          ▼           ▼            ▼
    localhost:5000 localhost:8080 localhost:8081
     Python API      Go API        Java API
       晴れ           曇り            雨
    

    ① Python (Flask)

    from flask import Flask, jsonify
    from datetime import datetime
    
    app = Flask(__name__)
    
    @app.route("/weather")
    def weather():
    
        return jsonify({
            "weather": "晴れ",
            "temperature": 30,
            "humidity": 65,
            "datetime": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        })
    
    app.run(port=5000, debug=True)
    

    ② Go

    package main
    
    import (
    	"encoding/json"
    	"net/http"
    	"time"
    )
    
    type Weather struct {
    	Weather     string `json:"weather"`
    	Temperature int    `json:"temperature"`
    	Humidity    int    `json:"humidity"`
    	Datetime    string `json:"datetime"`
    }
    
    func weatherHandler(w http.ResponseWriter, r *http.Request) {
    
    	data := Weather{
    		Weather:     "曇り",
    		Temperature: 27,
    		Humidity:    72,
    		Datetime:    time.Now().Format("2006-01-02 15:04:05"),
    	}
    
    	w.Header().Set("Content-Type", "application/json")
    	json.NewEncoder(w).Encode(data)
    
    }
    
    func main() {
    
    	http.HandleFunc("/weather", weatherHandler)
    
    	http.ListenAndServe(":8080", nil)
    
    }
    

    ③ Java (Spring Boot)

    @RestController
    public class WeatherController {
    
        @GetMapping("/weather")
        public Map<String,Object> weather(){
    
            Map<String,Object> map = new HashMap<>();
    
            map.put("weather","雨");
            map.put("temperature",24);
            map.put("humidity",88);
            map.put("datetime",
                    LocalDateTime.now()
                                 .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
    
            return map;
        }
    
    }
    

    ※Spring Bootのデフォルトポートは8080なので、

    application.properties
    

    へ

    server.port=8081
    

    を追加します。


    ④ クライアント(index.html)

    <!DOCTYPE html>
    <html lang="ja">
    
    <head>
    <meta charset="UTF-8">
    <title>天気APIデモ</title>
    
    <style>
    
    body{
        font-family: sans-serif;
        margin:30px;
    }
    
    button{
        width:120px;
        height:40px;
        margin:5px;
        font-size:16px;
    }
    
    table{
        margin-top:20px;
        border-collapse:collapse;
    }
    
    td{
        border:1px solid black;
        padding:8px;
    }
    
    </style>
    
    </head>
    
    <body>
    
    <h2>天気APIデモ</h2>
    
    <button onclick="loadWeather('http://localhost:5000/weather')">
    Python
    </button>
    
    <button onclick="loadWeather('http://localhost:8080/weather')">
    Go
    </button>
    
    <button onclick="loadWeather('http://localhost:8081/weather')">
    Java
    </button>
    
    <table>
    
    <tr>
    <td>天気</td>
    <td id="weather"></td>
    </tr>
    
    <tr>
    <td>気温</td>
    <td id="temp"></td>
    </tr>
    
    <tr>
    <td>湿度</td>
    <td id="hum"></td>
    </tr>
    
    <tr>
    <td>日時</td>
    <td id="dt"></td>
    </tr>
    
    </table>
    
    <script>
    
    function loadWeather(url){
    
    fetch(url)
    .then(res=>res.json())
    .then(data=>{
    
    document.getElementById("weather").textContent=data.weather;
    document.getElementById("temp").textContent=data.temperature+" ℃";
    document.getElementById("hum").textContent=data.humidity+" %";
    document.getElementById("dt").textContent=data.datetime;
    
    })
    .catch(err=>alert(err));
    
    }
    
    </script>
    
    </body>
    </html>
    

    動作イメージ

    ① Pythonボタン

    GET http://localhost:5000/weather
    

    ↓

    {
      "weather":"晴れ",
      "temperature":30,
      "humidity":65,
      "datetime":"2026-07-07 14:32:18"
    }
    

    ② Goボタン

    GET http://localhost:8080/weather
    

    ↓

    {
      "weather":"曇り",
      "temperature":27,
      "humidity":72,
      "datetime":"2026-07-07 14:32:21"
    }
    

    ③ Javaボタン

    GET http://localhost:8081/weather
    

    ↓

    {
      "weather":"雨",
      "temperature":24,
      "humidity":88,
      "datetime":"2026-07-07 14:32:25"
    }
    

    この教材のポイント

    この構成の一番の学びは、「クライアントはサーバーの実装言語を意識しない」ということです。

    クライアントが違いとして知っているのはアクセス先のURLだけです。

    Python → http://localhost:5000/weather
    Go     → http://localhost:8080/weather
    Java   → http://localhost:8081/weather
    

    返ってくるJSONの形式が同じなので、loadWeather() 関数はどのAPIに対しても同じコードで動作します。

    これは実際のWebシステムでも非常によく使われる設計で、「APIの仕様(契約)を守れば、サーバー側の実装は自由に変更できる」という考え方を体験できる、教育用として非常に分かりやすいサンプルになるでしょう。



    この題材は、APIの本質を伝えるのにとても良い構成だと個人的には思いました。

    実際の開発でも、プログラムを書く前にAPI仕様を決めることが非常に重要です。

    例えば、今回の話を教材にするなら、最初に次のような「仕様書」を見せるのも効果的です。
    「APIは約束事」という考え方が伝えやすくなると思います。

    項目:内容
    URL:/weather
    メソッド:GET
    レスポンス形式:JSON
    weather:天気(文字列)
    temperature:気温(整数)
    humidity:湿度(整数)
    datetime:サーバーの現在日時(文字列)

    そして、「この仕様を守ること」が大事だと説明します。

    • Pythonで作っても

    • Goで作っても

    • Javaで作っても

    同じ仕様のJSONを返すようにすれば、クライアントは変更せずに利用できます。

    逆に、例えばGoだけ次のように項目名を変えてしまうと、

    {
      "weather": "曇り",
      "temp": 27,
      "humidity": 72,
      "datetime": "2026-07-07 15:00:00"
    }
    

    クライアントは temperature を探しているため、気温が表示されなくなります。

    「プログラムは動いているのに画面がおかしい」という現象になり、API仕様を守ることの重要性を実感できます。


    今回の話を教材にするなら、次のような流れがおすすめです。

    1. APIとは何か(レストランの例)

    2. API仕様を決める(URL・JSON・HTTPメソッド)

    3. PythonでAPIを作る

    4. GoでAPIを作る

    5. JavaでAPIを作る

    6. 1つのHTMLクライアントから3つのAPIを切り替えて利用する

    7. あえて仕様を壊してみる(例:temperature を temp に変更)

    8. 「なぜ動かなくなったのか?」を考える

    9. API仕様を元に戻して正常に動作することを確認する

    最後の「わざと壊して原因を考える」という演習は、受講者の印象に強く残ります。「APIは単なる通信ではなく、仕様という契約を守ることで初めて連携できる」ということを体験的に理解できるからです。

    この教材なら、APIの基礎から実務で大切な「設計」「契約」「疎結合」の考え方まで、自然な流れで学んでもらえると思います。





     
     
    AIと一緒に「気になったことを、とことん調べて、試して、残す」noteです。AI・ITから歴史、科学、健康、お金、旅、社会までジャンル横断。難しい話もなるべく分かりやすく。毎日の疑問を学びに変える雑記帳です📝

    あなたへのおすすめ