ドキュメント / 詳細設計 / インターフェース系
•
PART 01 / 02
•
2026.06.18
•
20 min read
PART 01 — 外部IF設計書
システム間連携のプロトコル・データ形式・エラー処理
外部IFは「2つのシステムの取り決め書」だ。どちらのシステムが何を送り、何を返すか、エラー時にどう振る舞うかを明確に定義しないと、疎通テスト時に責任の所在が曖昧になる。
外部IF設計書の位置づけ
自システムが外部システム(社内他システム・外部サービス・パートナー)と連携する際の「インターフェース仕様書」だ。結合テスト・受入テストの前提として、両システム担当者がこの設計書を合意した上で開発を進めることが必要だ。
⚠️ 外部IF で特に注意すること
文字コード(UTF-8 / Shift_JIS)・改行コード(LF / CRLF)・タイムゾーン(JST / UTC)の齟齬は、実際の結合テストで頻発するトラブルの原因となる。設計段階で必ず確認・合意しておく。
IF一覧
| IF-ID | IF名 | 連携先 | 方向 | 方式 | タイミング |
| IF-001 | 在庫連携 | 在庫管理システム | 受信 | REST API(JSON) | リアルタイム |
| IF-002 | 売上データ送信 | 基幹システム | 送信 | SFTP(CSV) | 日次バッチ |
| IF-003 | 決済結果受信 | 決済代行業者 | 受信 | Webhook(JSON) | リアルタイム |
| IF-004 | メール送信 | 外部メールサービス | 送信 | REST API(JSON) | 都度 |
定義すべき項目一覧
| 分類 | 定義項目 | 必須度 |
| 基本情報 | IF-ID・IF名・連携先システム名・担当者 | ◎ |
| 基本情報 | 連携目的・トリガー(タイミング) | ◎ |
| 通信 | プロトコル・エンドポイント・ポート番号 | ◎ |
| 通信 | 認証方式・暗号化方式 | ◎ |
| データ | データ形式(JSON / CSV / XML)・文字コード | ◎ |
| データ | 送受信項目定義(項目名・型・必須・説明) | ◎ |
| データ | 送受信例(サンプルデータ) | ◎ |
| エラー | エラーコード・リトライ回数・タイムアウト | ◎ |
| 非機能 | 最大データ量・想定件数・SLA | ○ |
通信プロトコル定義
■ 通信プロトコル仕様(IF-001: 在庫連携)
【基本情報】
IF-ID : IF-001
IF名 : 在庫照会API
連携先 : 在庫管理システム(在庫管理部門)
方向 : 自システム → 在庫管理システム(リクエスト)
在庫管理システム → 自システム(レスポンス)
トリガー : 商品詳細ページ表示時、または注文確定前
【通信仕様】
プロトコル : HTTPS
エンドポイント: https://inventory.internal.example.com/api/v2/stock
ポート : 443
HTTPメソッド: POST
タイムアウト: 5秒(接続 3秒 + 読取 2秒)
リトライ : 3回(間隔: 1秒 → 2秒 → 4秒 指数バックオフ)
【認証】
方式 : APIキー
ヘッダー : X-API-Key: {APIキー}
APIキー管理 : システム環境変数 INVENTORY_API_KEY に格納(ソースコードに含めない)
【文字コード・フォーマット】
文字コード : UTF-8(BOMなし)
タイムゾーン: UTC(送受信ともUTC、画面表示時にJSTに変換)
IF-001 リクエスト/レスポンス定義
■ リクエスト(JSON)
{
"product_codes": ["PROD-001", "PROD-002"], // 必須 string[] 最大50件
"request_id": "uuid-v4" // 必須 string トレース用
}
■ レスポンス(正常: HTTP 200)
{
"request_id": "uuid-v4",
"stocks": [
{
"product_code": "PROD-001", // string
"stock_quantity": 150, // integer 0以上
"available_quantity": 120, // integer 引当済み分を除いた在庫
"updated_at": "2026-06-18T03:00:00Z" // ISO8601 UTC
}
]
}
■ レスポンス(エラー: HTTP 4xx/5xx)
{
"error_code": "INV_001",
"error_message": "指定された商品コードが存在しません",
"invalid_codes": ["PROD-999"]
}
エラー処理・リトライ方針
| エラー種別 | HTTP | エラーコード | 自システムの対応 |
| タイムアウト | — | — | 3回リトライ → 失敗時は「在庫確認中」として処理継続 |
| 商品コード不正 | 400 | INV_001 | 該当商品の在庫を「不明」として表示、処理継続 |
| 認証エラー | 401 | INV_AUTH | リトライせずアラート通知 |
| レート超過 | 429 | INV_RATE | Retry-After ヘッダーの秒数を待ってリトライ |
| サーバーエラー | 500 | INV_ERR | 3回リトライ → 失敗時はアラート通知 + フォールバック |
Python Tips — IF 疎通テストの自動化
Python — 外部IF 疎通テストスクリプト
"""
外部IF の疎通テストを自動化するスクリプト
pip install requests
"""
import requests, json, uuid, time
ENDPOINT = "https://inventory.internal.example.com/api/v2/stock"
API_KEY = "your-api-key-here"
HEADERS = {"Content-Type": "application/json", "X-API-Key": API_KEY}
TEST_CASES = [
{"name": "正常系: 在庫あり商品",
"payload": {"product_codes": ["PROD-001"], "request_id": str(uuid.uuid4())},
"expect_status": 200},
{"name": "正常系: 複数商品",
"payload": {"product_codes": ["PROD-001","PROD-002"], "request_id": str(uuid.uuid4())},
"expect_status": 200},
{"name": "異常系: 存在しない商品コード",
"payload": {"product_codes": ["PROD-999"], "request_id": str(uuid.uuid4())},
"expect_status": 400},
{"name": "異常系: 空配列",
"payload": {"product_codes": [], "request_id": str(uuid.uuid4())},
"expect_status": 400},
]
results = []
for tc in TEST_CASES:
start = time.time()
try:
r = requests.post(ENDPOINT, headers=HEADERS,
json=tc["payload"], timeout=10)
elapsed = time.time() - start
ok = r.status_code == tc["expect_status"]
results.append({"name": tc["name"], "status": r.status_code,
"elapsed_ms": int(elapsed * 1000),
"ok": ok, "body": r.json()})
except Exception as e:
results.append({"name": tc["name"], "ok": False, "error": str(e)})
print("=" * 60)
for r in results:
mark = "✅" if r.get("ok") else "❌"
print(f'{mark} {r["name"]}')
if "elapsed_ms" in r:
print(f' HTTP {r["status"]} | {r["elapsed_ms"]}ms')
ng = [r for r in results if not r.get("ok")]
print(f"\n結果: {len(results) - len(ng)}/{len(results)} 件成功")
レビューチェックリスト
| # | チェック項目 |
| 1 | 文字コード・改行コード・タイムゾーンが明示されているか |
| 2 | 認証方式・APIキー管理方針が定義されているか |
| 3 | タイムアウト値・リトライ回数が定義されているか |
| 4 | 全エラーパターンとシステムの対応が定義されているか |
| 5 | サンプルデータ(リクエスト/レスポンス例)が記載されているか |
| 6 | 連携先担当者との合意が取れているか |