外部IF設計書の位置づけ

自システムが外部システム(社内他システム・外部サービス・パートナー)と連携する際の「インターフェース仕様書」だ。結合テスト・受入テストの前提として、両システム担当者がこの設計書を合意した上で開発を進めることが必要だ。

⚠️ 外部IF で特に注意すること

文字コード(UTF-8 / Shift_JIS)・改行コード(LF / CRLF)・タイムゾーン(JST / UTC)の齟齬は、実際の結合テストで頻発するトラブルの原因となる。設計段階で必ず確認・合意しておく。

IF一覧

IF-IDIF名連携先方向方式タイミング
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-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回リトライ → 失敗時は「在庫確認中」として処理継続
商品コード不正400INV_001該当商品の在庫を「不明」として表示、処理継続
認証エラー401INV_AUTHリトライせずアラート通知
レート超過429INV_RATERetry-After ヘッダーの秒数を待ってリトライ
サーバーエラー500INV_ERR3回リトライ → 失敗時はアラート通知 + フォールバック

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連携先担当者との合意が取れているか