Groupon APIの利用に関するまとめ

稀なケースが発生すると、疎結合なデータマッピングアプリケーションが正常に動作しなくなることがあります。これは、特にインターネットを通じて利用可能な大規模なデータセットを扱う場合や、ソースデータに対してほとんど、あるいは全く影響を与えられない場合に顕著です。本稿では、データマッピングおよび変換プロジェクトに取り組む開発者が、リモートソースから送信されるデータストリーム内の予期せぬデータを迅速に特定し、対応するためのデバッグ手法について説明します。 問題点 昨夏、私たちはブログ記事のシリーズを公開し、その中で「〜する方法」について解説しました Groupon APIを利用して開発を行う グルーポンが展開しているすべての都市における、特定の条件に合致するオファーの一覧を取得し、その情報をウェブブラウザやモバイルデバイスで閲覧しやすいように整形すること。

私たちは、MapForceを使用してデータマッピングを実行するコマンドラインを作成しました。このマッピングは、Groupon APIを150回以上呼び出し、各Grouponの都市に対して実行されます。その後、データをフィルタリングして、実店舗ではなくインターネット上で販売されているお得な情報を抽出し、StyleVisionを使用して結果をHTML形式で整形します。毎日朝、このコマンドラインをバッチファイルで実行し、HTML形式の出力結果をローカルサーバーに保存します。これにより、同僚はWebブラウザを使って、全国各地のお得な情報にアクセスできます。

このマッピングは、2ヶ月以上問題なく動作していました。しかし、ある日、以下のエラーメッセージが表示され、停止しました。「dateTime型のソース値 ""を、ターゲット型のdateTimeに変換できませんでした。」

このエラーの具体的な原因は、マッピングのどこかで、dateTime型のデータが期待される箇所に、空の値が返されたことです。より抽象的なレベルで見ると、このエラーは、私たちのマッピング戦略の潜在的な欠陥を示唆しています。

Groupon APIを呼び出すたびに、適切に構造化されたXMLデータストリームが、要素内に含まれて返されます。しかし、APIの仕様には、返されるデータの構造を定義するXMLスキーマが含まれていません。

マッピングを開発する際、私たちは生のデータを分析し、必要な出力を選択する必要がありました。そのため、最初のステップとして、APIを呼び出して、ある広大な都市圏のすべてのGrouponの情報を取得しました。私たちは、APIの応答に含まれるすべての可能なオプションを網羅するのに十分な量のデータが得られると想定していました。

2ヶ月間、マッピングが正常に動作した後、APIはついに、私たちが想定していたパターンには合わない、まれなケースを返しました。

デバッグツール MapForceは、デバッグを支援する機能を提供しています。MapForceに組み込まれた実行エンジンを使用してデータマッピングを実行することで、メッセージウィンドウに詳細な情報が表示されます。

「関連する場所」と表示された項目は、エラーが発生したマッピング内の該当するコンポーネントへのハイパーリンクとして機能します。エラー結果をクリックすると、format-dateTime関数が起動します。

エラーメッセージをクリックするか、値の接続先を追跡することで、format-dateTime関数への入力要素を特定できます。いずれの方法でも、エラーの原因となった要素を特定することができます。

問題の原因は、入力コンポーネントにあります。このコンポーネントは、Groupon APIへの呼び出しによって返されるすべてのデータを、フィルタリングや変換を行う前に収集します。マッピングを設計した際、サンプルデータ内の "endAt" 要素は、各Grouponオファーの終了日時を常に示していましたが、何らかの理由で、このフィールドに空の値が返されていました。もしこのエラーがローカルの入力ファイルを実行した場合に発生したのであれば、ファイルの内容を簡単に確認できたはずです。しかし、今回はデータが複数のURLから取得されており、マッピング処理が行われるまで一時的に保持されているだけです。幸いなことに、この問題を簡単に解決できる方法があります。入力コンポーネントをコピーし、そのコピーをマッピングに貼り付けます。元のコンポーネントからのレスポンス要素を、コピーされたコンポーネントに接続することで、両方のコンポーネント間のすべてのサブ要素が同時にマッピングされます。

弊社のオリジナル入力コンポーネントは、現在2つの出力コンポーネントに接続されています。MapForceに組み込まれた実行エンジンによってどの出力コンポーネントが生成されるかを選択するには、どの出力コンポーネントの上部右隅にあるアイコンをクリックします。新しい出力コンポーネントは、入力コンポーネント内のすべてのデータをそのままコピーして保存するだけです。XMLSpyを使って生データを調べてみると、日付と時刻が表示されるはずの場所に、確かに空の要素が存在することが確認できました

解決策

現在、オファーに具体的な終了時間が設定されていない可能性があることがわかっているので、その可能性を考慮してマッピングを計画することができます。修正されたエンドポイント(endAt)の処理において、元のフォーマット変換関数を実行する前に、条件分岐を行い、endAt要素が空の場合には別の出力結果を提供します。

我々は迅速に対応する必要がありました。なぜなら、Grouponのデータはすべて時間制約があるからです。問題が発生しているデータは、いずれ期限切れとなり、データストリームから消えてしまいます。この経験から、強力なデバッグツールを持つこと、そしてデータマッピングプロジェクトが正常に稼働しているように見えても、それらを創造的に活用することの重要性を学びました。Altova MapForceは無料トライアルで利用可能です。次に解決する問題が、あなた自身のものになるかもしれません。

編集後記: 弊社のGroupon APIから取得したデータを活用したオリジナルシリーズは、3つのパートで構成されており、以下のリンクをクリックして各パートをご覧ください。パート1: Altova MapForce を使用した Groupon API の処理 複数のURLからデータを収集することで、動的な入力を作成する方法について説明します。 MapForceを使ったGroupon APIの処理 - 第2部 APIから取得したデータをどのようにフィルタリングし、必要な情報のみを抽出するために、出力形式をどのように定義したかを説明します。 Groupon APIの利用方法 - 第3部 この機能は、出力結果をデスクトップ環境とモバイルデバイスの両方で最適化された単一のHTMLドキュメントとして整形する方法について説明し、繰り返し実行を自動化するための方法についても解説しています。