【授業レポート】システム開発入門 第23週目 〜API連携ミニプロジェクト発表&改善〜
23週目の授業では、先週学んだ外部API連携を使った**ミニプロジェクト(例:天気取得アプリや名言取得アプリ)**の発表と改善を行いました。実際に動くものを作り、エラーハンドリングや使い勝手を磨く実践的な回です。
■ 先生の導入:「APIは“つなぐ力”だけど、扱いは慎重に」
田中先生:「外のサービスとつながると、アプリの価値はぐっと上がります。けれど、接続エラーや想定外のデータにも備える必要がある。今日は“動く”だけでなく“堅牢にする”ことを意識しましょう。」
■ 発表タイム:各チームのデモと工夫点
生徒たちは自作アプリを順番にデモ。発表内容とクラスの反応の一部を紹介します。
-
天気ミニアプリチーム:都市名を入力すると現在の天気と気温が表示されるアプリ。非同期に近い挙動(リクエスト中に表示する「読み込み中」)や、該当都市が見つからなかったときのメッセージを工夫。
感想:「ネットが遅いときに“読み込み中”があると安心する!」 -
ランダム名言アプリチーム:名言APIを叩いて1件を表示。APIが落ちている場合はローカルの名言リストにフォールバック。
感想:「外部に頼りきりにしない設計が役立つと分かった!」 -
翻訳+表示連携チーム:短い文章を翻訳APIに送り、訳文を表示するワークフローを実演。認証エラー時の対応や、翻訳結果の長さ制限のハンドリングを説明。
感想:「APIの制約(文字数制限など)を考える設計が必要だと気づいた」
■ 技術ワーク:信頼性を高める実装ポイント
クラスで取り上げ、実習で改善した代表的なポイント。
1) タイムアウトと例外処理
外部通信は失敗する前提で書くこと。requests
を使う場合のサンプル(学習用疑似コード):
import os
import requests
API_URL = "https://api.example.com/weather"
API_KEY = os.getenv("API_KEY") # 秘密情報は環境変数で管理
try:
resp = requests.get(API_URL, params={"q": "Tokyo", "appid": API_KEY}, timeout=5)
resp.raise_for_status() # ステータスコードが200系でないと例外を送出
data = resp.json()
# JSONの取り出しは安全に(キーが無い場合に備える)
temp = data.get("main", {}).get("temp")
if temp is None:
print("温度情報が取得できませんでした。")
else:
print(f"現在の気温:{temp}℃")
except requests.exceptions.Timeout:
print("通信がタイムアウトしました。時間を置いて再度お試しください。")
except requests.exceptions.RequestException as e:
print(f"通信エラーが発生しました:{e}")
2) フォールバック戦略
APIが利用不可のときに、ローカルのデータやキャッシュを使うことでユーザー体験を守る方法を取り入れました。
3) レート制限とキャッシュ
短時間に何度もリクエストしないように、同じクエリは一定時間キャッシュする仕組みを導入したチームがありました。学校環境では簡易的にメモリ上の辞書を使って実装することが多いです。
■ ユーザビリティ改善:見た目と言葉づかい
技術だけでなく「誰が使うか」を意識して、表示文言や操作ガイドを改善する時間も設けました。
- 「エラーが出た」ではなく「××が原因で情報を取得できませんでした。後で再度お試しください。」と具体的に書く
- 長いJSONを表示する際は、重要情報だけを抜き出して見やすくする
- ネットワーク待ちの間にヒントや使い方を表示することで離脱を減らす
生徒の声:「エラーメッセージを変えただけで、先生に『分かりやすい』って褒められた!」
■ 先生のひとこと
「外部サービスとつながるアプリは便利ですが、“外部要因”が増えるほど設計の難易度も上がります。今日学んだ『堅牢性(例外処理)』『ユーザビリティ(案内・フォールバック)』『ルールを守る(APIキー・レート)』の3つは、開発者としての基本中の基本です。」
■ 来週の予告:生成AIの導入入門(準備回)
次週からは3年生で扱う予定の生成AI(生成系モデル)の基礎概念に触れるプレ準備を行います。まずは「生成AIとは何か」「倫理と使い方」「APIの違い(REST vs. モデルAPI)」などの概念整理をして、簡単なプロンプト設計の練習をします。
外の世界とつながった23週目。生徒たちは「つながる楽しさ」と「つながる責任」の両方を実感し、次の学びへと期待を膨らませていました。