はじめに
OData サービスを構築したら、次に必要なのは「正しく動くこと」を確認するテストと、「動かない時」に原因を特定するデバッグです。OData のトラブルは、プロトコルの仕様・SAP Gateway の設定・バックエンドのロジック――複数の層にまたがって発生するため、体系的な切り分け手法を知っておくことが重要です。
ODataの基本概念についてはODataとは何か?SAPにおける役割と基本概念を解説を参照してください。本記事では以下の3つを扱います。
1. Gateway Client(/IWFND/GW_CLIENT) — SAP 内蔵の OData テストツール 2. エラーログと主要な確認ポイント — 問題の切り分け手法 3. よくあるエラーパターンと対処法 — 実務で遭遇する頻出エラー
なぜテスト・デバッグスキルが重要か(why so):OData サービスの問題は「画面が動かない」としてFiori側から報告されますが、原因はFioriアプリ・Gateway・バックエンドのどの層にもあり得ます。Fiori の開発者が Gateway の設定を確認できない、Basis 担当者が DPC(Data Provider Class:ODataサービスのバックエンドロジックを実装するABAPクラス)のロジックを追えない――こうした「層をまたぐ問題」を効率的に切り分けるために、全体像を理解しておく必要があります。OData サービスの構築方法についてはODataサービスの作り方|SEGW方式とCDS View+RAP方式を比較するで解説しています。
Gateway Client(/IWFND/GW_CLIENT)
Gateway Client とは
Gateway Client は、SAP 内蔵の OData テストツールです。ブラウザや Postman のようにHTTPリクエストを送信し、レスポンスを確認できます。SAP にログインした状態で使えるため、認証設定を別途行う必要がなく、最も手軽なテスト手段です。Gateway の全体像についてはSAP Gateway の仕組みと役割を解説を参照してください。
Tコード:/IWFND/GW_CLIENT
基本的な使い方
flowchart LR A["① **リクエストURI**入力"] --> B["② HTTPメソッド選択"] B --> C["③ 実行・レスポンス確認"] C --> D["④ 結果分析"]
- ① リクエストURI入力:
/sap/opu/odata/sap/サービス名/エンティティセットの形式でURIを入力 - ② HTTPメソッド選択:GET / POST / PUT / DELETE から選択
- ③ 実行・レスポンス確認:HTTPステータスコードとJSON/XMLのレスポンスボディを確認
- ④ 結果分析:データ内容が期待通りか確認。エラー時はメッセージの詳細を確認
よく使うリクエストパターン
テストは「サービスルート → メタデータ → 一覧取得 → 個別取得 → フィルタ/展開」の順に進めるのが効率的です。上流で問題があると下流のテストが全て失敗するため、この順序で段階的に確認することで原因の特定が容易になります。
| 目的 | リクエスト URI の例 |
|---|---|
| サービスルートの確認 | /sap/opu/odata/sap/Z_PO_SERVICE_SRV/ |
| メタデータの確認 | /sap/opu/odata/sap/Z_PO_SERVICE_SRV/$metadata |
| エンティティセット一覧取得 | /sap/opu/odata/sap/Z_PO_SERVICE_SRV/PurchaseOrderHeaderSet |
| キー指定で1件取得 | /sap/opu/odata/sap/Z_PO_SERVICE_SRV/PurchaseOrderHeaderSet('4500000001') |
| フィルタ付き取得 | ...PurchaseOrderHeaderSet?$filter=CompanyCode eq '1000'&$top=5 |
| $expand で関連取得 | ...PurchaseOrderHeaderSet('4500000001')?$expand=ToItems |
| 件数の確認 | ...PurchaseOrderHeaderSet/$count |
テスト時のチェックポイント
テストで確認すべき項目を優先度順に整理します。この優先度は「上位の項目が正常でないと、下位の項目を確認しても意味がない」という依存関係に基づいています。たとえばHTTPステータスが500の状態でデータ件数やパフォーマンスを確認しても無意味です。
| 優先度 | チェック項目 | 確認内容 |
|---|---|---|
| 1 | HTTP ステータスコード | 200(成功)、400(リクエスト不正)、403(権限不足)、404(サービス/エンティティ未検出)、500(サーバーエラー) |
| 2 | レスポンスのデータ件数 | 期待した件数が返っているか。0件の場合はフィルタ条件や権限を確認 |
| 3 | レスポンスの項目内容 | 各プロパティに正しい値が入っているか |
| 4 | $metadata の構造 | エンティティタイプ・プロパティ・Navigation Property が設計通りに公開されているか |
| 5 | パフォーマンス | レスポンス時間が許容範囲か(Gateway Client の画面下部に表示される) |
POST リクエスト(データ作成)のテスト
GET 以外のリクエストをテストする場合は、CSRF トークンの取得が必須です。
flowchart LR A["① GET/HEADリクエスト送信\nx-csrf-token: Fetch"] --> B["② CSRFトークン取得"] B --> C["③ POSTリクエスト送信\nCSRFトークン設定"]
Gateway Client では「HTTPヘッダー追加」ボタンからヘッダーを設定できます。POST のボディ(JSON)は「リクエストボディ」入力欄に記述します。
エラーログと主要な確認ポイント
エラー調査の全体フロー
OData のエラーが発生した場合、「どの層で問題が起きているか」を最初に切り分けるのが鉄則です。
flowchart LR
A["エラー発生"] --> B{"HTTPステータスは?"}
B -->|"404"| C["サービス未登録 / URL誤り"]
B -->|"403"| D["権限不足"]
B -->|"400"| E["リクエスト不正"]
B -->|"500"| F{"エラーログを確認"}
F -->|"Gateway層"| G["**/IWFND/ERROR_LOG**"]
F -->|"バックエンド層"| H["**ST22** / DPCデバッグ"]- 404:
**/IWFND/MAINT_SERVICE**でサービス登録状態を確認 - 403:
**SU53**/PFCGで権限設定を確認 - 400:URLやJSONの構文を見直す
- 500(Gateway層):
/IWFND/ERROR_LOGでエラーメッセージを確認 - 500(バックエンド層):
ST22でダンプ確認、またはDPCクラスをデバッグ
主要な確認ツール一覧
以下がODataのテスト・デバッグで使用する主要なTコードです。Tコードの基本についてはSAP Tコードとは?主要トランザクションコード一覧を参照してください。
| Tコード / ツール | 層 | 用途 |
|---|---|---|
| /IWFND/GW_CLIENT | Gateway | OData リクエストのテスト実行 |
| /IWFND/ERROR_LOG | Gateway | Gateway 層のエラーログ確認(詳細なエラーメッセージとスタックトレース) |
| /IWFND/MAINT_SERVICE | Gateway | サービスの登録状態・有効化状態の確認 |
| ST22 | バックエンド | ABAPショートダンプ(実行時エラー)の確認 |
| SU53 | バックエンド | 直前の権限チェック失敗の詳細確認。権限管理についてはSAP権限管理の基本で解説 |
| /IWBEP/TRACES | バックエンド | OData のペイロードレベルのトレース(リクエスト/レスポンスの中身を記録) |
| ST05 | バックエンド | SQL トレース。CDS View やDPCが発行するSQLを確認 |
/IWFND/ERROR_LOG の読み方
/IWFND/ERROR_LOG は OData のトラブルシューティングで最初に確認すべきツールです。
| 画面要素 | 確認ポイント |
|---|---|
| タイムスタンプ | エラーが発生した日時。問題の再現タイミングと照合 |
| HTTPステータスコード | 返却されたステータス。500系はサーバー内部エラー |
| リクエストURI | どの OData リクエストでエラーが起きたか |
| エラーメッセージ | SAPのメッセージ番号(例:/IWBEP/CM_V4_RUNTIME/001)を含む詳細メッセージ |
| スタックトレース | エラーが発生した ABAP のコールスタック。DPC のどのメソッドで失敗したかが分かる |
読者への示唆(so what):エラーログの「エラーメッセージ」と「スタックトレース」を組み合わせて読むことで、「何が原因か(メッセージ)」と「どこで発生したか(スタック)」の両方が分かります。この2つを特定してから対処に入ることで、試行錯誤の時間を大幅に削減できます。
ABAP デバッガーでの DPC デバッグ
エラーログだけでは「どのメソッドで失敗したか」は分かっても「なぜ失敗したか」までは分からないケースがあります。たとえば条件分岐の結果やループ中の変数値など、実行時の状態を確認するにはデバッガーでの追跡が必要です。SEGW 方式のサービスでバックエンドのロジックをデバッグする場合、DPC_EXT のメソッドにブレークポイントを設定します。
| ステップ | 操作 |
|---|---|
| ① | DPC_EXT クラスの該当メソッド(例:GET_ENTITYSET)に外部ブレークポイントを設定 |
| ② | /IWFND/GW_CLIENT または Fiori アプリから OData リクエストを実行 |
| ③ | ABAP デバッガーが起動するので、変数の中身やロジックの流れを確認 |
RAP 方式の場合は、Behavior Implementation クラスの該当メソッドにブレークポイントを設定します。
よくあるエラーパターンと対処法
パターン①:404 Not Found — サービスが見つからない
症状:OData リクエストに対して HTTP 404 が返る
原因と対処:
| 確認項目 | 対処法 |
|---|---|
| サービスが有効化されていない | /IWFND/MAINT_SERVICE でサービスを有効化する |
| URL のサービス名が間違っている | $metadata にアクセスしてサービス名を確認する。サービス名末尾の _SRV の付け忘れが頻出 |
| エンティティセット名が間違っている | $metadata でエンティティセットの正確な名前を確認する |
| システムエイリアスの設定漏れ | /IWFND/MAINT_SERVICE でバックエンドシステムとの接続設定を確認 |
パターン②:403 Forbidden — 権限不足
症状:HTTP 403 が返る、または「権限がありません」のメッセージ
原因と対処:
| 確認項目 | 対処法 |
|---|---|
| OData サービスの実行権限がない | SU53 で直前の権限チェック失敗を確認し、不足している権限オブジェクトを特定する |
| ICF ノードが有効化されていない | Tコード SICF で /sap/opu/odata/ 配下のノードが有効か確認 |
| CDS View のアクセス制御(DCL) | CDS View に定義された DCL(Data Control Language)の条件を確認 |
パターン③:500 Internal Server Error — サーバー内部エラー
症状:HTTP 500 が返る
これは最も原因の幅が広いエラーです。以下の順序で切り分けます。
| 手順 | 確認先 | 確認内容 |
|---|---|---|
| ① | /IWFND/ERROR_LOG | エラーメッセージとスタックトレースを確認 |
| ② | ST22 | ABAP ショートダンプが出ていないか確認 |
| ③ | DPC_EXT / Behavior Implementation | ロジック内の例外処理やデータ不整合を確認 |
| ④ | ST05(SQL トレース) | DB アクセスでエラーが出ていないか確認 |
パターン④:200 OK だがデータが0件
症状:HTTP 200 が返るがレスポンスのデータが空
| 確認項目 | 対処法 |
|---|---|
$filter の条件が厳しすぎる | フィルタなしでリクエストして、データが存在するか確認 |
| 権限フィルタリング | CDS View のアクセス制御(DCL)が効いている可能性。権限ロールを確認 |
| データが本当に存在しない | SE16N で元テーブルを直接確認。テーブルブラウザの使い方はSE16 / SE16N / SE16H 完全解説を参照 |
| クライアント(マンダント)違い | 正しいクライアントにログインしているか確認。SAPのクライアントとは何かを参照 |
パターン⑤:CSRF トークンエラー
症状:POST / PUT / DELETE で「CSRF token validation failed」
対処:更新系リクエストの前に、GETまたはHEAD リクエストで x-csrf-token: Fetch ヘッダーを送信してトークンを取得し、更新リクエストのヘッダーにそのトークンを含める必要があります。Fiori アプリではフレームワークが自動処理するため通常は発生しませんが、外部システムからの呼び出しやテストツールで頻出します。
パターン⑥:$expand が動作しない
症状:$expand=ToItems を指定してもナビゲーション先のデータが返らない
| 確認項目 | 対処法 |
|---|---|
| Navigation Property 名が間違っている | $metadata で Navigation Property の正確な名前を確認 |
| DPC_EXT の実装漏れ(SEGW方式) | GET_ENTITYSET だけでなく、Navigation 用のメソッドも実装が必要 |
| アソシエーション定義の不備(CDS View) | CDS View の association 定義と射影リストへの公開を確認 |
| GET_EXPANDED_ENTITYSETの再定義が空 | SEGWでメソッドを再定義したが実装が空の場合、$expand結果が空になる。再定義したメソッド内にロジックを実装するか、不要なら再定義自体を削除する |
テスト効率を上げるTips
Tip 1:$metadata を最初に確認する
新しいサービスをテストする際は、最初に $metadata を確認するのが鉄則です。エンティティタイプの構造、プロパティ名、Navigation Property の名前が正しいかを確認してからデータ取得のテストに進むことで、「名前が違った」という初歩的なミスを避けられます。
Tip 2:$top=1 で軽くテストする
エンティティセットの全件取得は時間がかかる場合があります。最初は $top=1 をつけて1件だけ取得し、構造とデータの妥当性を確認します。
Tip 3:Gateway Client のリクエスト履歴を活用する
Gateway Client は過去のリクエスト履歴を保持しています。「前回」ボタンで直前のリクエストを呼び出せるため、URL を再入力する手間が省けます。
Tip 4:外部ツール(Postman 等)との使い分け
| ツール | 用途 |
|---|---|
| Gateway Client | SAP にログインした状態での手軽なテスト。認証設定不要 |
| Postman | 外部からのアクセスをシミュレート。認証ヘッダーの設定が必要だが、リクエストの保存・共有が容易 |
| ブラウザ | GET リクエストのみ。URL を入力するだけで結果確認可能 |
まとめ
- Gateway Client(/IWFND/GW_CLIENT)は SAP 内蔵の OData テストツールであり、認証設定不要で最も手軽なテスト手段
- エラー調査は「HTTP ステータスコードでの層の切り分け」から始める(404=サービス設定、403=権限、500=バックエンドロジック)
- /IWFND/ERROR_LOG は OData トラブルシューティングで最初に確認すべきツール。エラーメッセージ+スタックトレースで原因と発生箇所を特定
- 頻出エラーパターン(404、403、500、0件、CSRF、$expand)の切り分け手順を覚えておくと、調査時間を大幅に短縮できる
- テストの基本は「$metadata で構造確認 → $top=1 で軽くテスト → 本格テスト」の順序
次回の記事 Fiori アプリと OData の関係|Fiori が OData をどう使うか では、Fiori が OData をどう使うか、Fiori Elements の仕組みを解説します。
ODataのテスト・デバッグ力をさらに高めるには、Gateway Clientの操作だけでなくABAP側のロジックまで理解することが不可欠です。ABAP・OData・RAP・UI5 Fioriまで一貫して学べる実践講座で、トラブルの原因を自力で追える実践力が身につきます。