このCookBookでは、IM-LogicDesignerを利用して、指定したURLのHTMLから正規表現を利用して任意の文字列を取得する方法を紹介します。
JavaScript定義とREST定義を作成するだけで、簡単に実現可能です。
例えば、定期的に実行することでバージョンアップ監視に利用できます。
前提条件
IM-FormaDesignerで作成した画面から動作確認したい場合は、環境にIM-BISが含まれている必要があります。
完成イメージでは、IM-FormaDesignerで作成した画面からIM-BISの外部連携機能を利用して動作確認ができます。
完成イメージ
IM-FormaDesignerで作成したフォームからこのCookBookで作成するロジックフローを呼び、Resinのバージョンを取得してみます。
1. URL に http://caucho.com/products/resin/download
を入力してください。
2. check pattern に http://caucho.com/download/resin-pro-(.+?).zip
を入力してください。
3. execute ボタンをクリックしてください。
4. 正規表現で取得した文字列が、テキストボックスに表示されます。
完成サンプル
以下の完成サンプルをローカル環境にインポートしてご活用ください。
なお、以下のサンプルはintra-mart Accel Platform 2017 Summerの環境を利用して作成されたものです。
- IM-LogicDesigner インポート: im_cookbook_122851_logicdesigner.zip
- IM-Formaアプリ インポート: im_cookbook_122851_forma.zip
- IM-BIS データソース定義 インポート: im_cookbook_122851_datasource.zip
ローカル環境で表示させる場合は、以下のURLにアクセスしてください。
http://localhost:8080/imart/forma/normal/view/regist_application_view/im_cookbook_122851_forma
なおベースURLである以下の部分は、環境に合わせて適宜変更してください。
http://localhost:8080/imart
また、IM-LogicDesignerの資材インポート後に、デバッグ機能を利用しても動作確認が可能です。
デバッグ機能について、詳しくは以下のドキュメントをご覧ください。
レシピ
- HTML のテキストを取得するREST定義を作成します。
- 正規表現で任意の文字列を取得するJavaScript定義を作成します。
- 作成したユーザ定義を利用して、ロジックフローを作成します。
HTML のテキストを取得するREST定義を作成します。
HTMLを取得するREST定義を作成します。
URLを入力として、取得したHTMLを出力とする定義です。
入力値には以下を設定してください。
パラメータとデータ型 | 説明 |
---|---|
url |
取得したいHTMLのURLです。 |
出力値は既に設定されているので設定不要です。
エンドポイントには ${ url }
と入力してください。
このようにEL式が利用でき、実行時には入力パラメータ url
に指定した値で置き換わります。
リクエストヘッダやリクエストパラメータは不要です。
また、レスポンス種別は text
とします。
これで、 入力値の url
から取得したHTMLを出力する定義が作成できました。
REST定義の作成について、詳しくは以下のドキュメントをご覧ください。
正規表現で任意の文字列を取得するJavaScript定義を作成します。
正規表現を利用して、文字列から任意の一部を取得するJavaScript定義を作成してみます。
入力値には以下を設定してください。
パラメータとデータ型 | 説明 |
---|---|
targetStr |
取得したHTMLです。 |
regexp |
正規表現です。 |
出力値には以下を設定してください。
パラメータとデータ型 | 説明 |
---|---|
result |
正規表現で取得した文字列です。 |
スクリプトには、正規表現で文字列を取得するスクリプトを実装してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function run(input) { var regexp = new RegExp(input.regexp); var arr = input.targetStr.match(regexp); var result = ''; if ( arr !== null ) { result = arr[0].replace(regexp, '$1'); } return { result: result }; } |
これで、文字列から任意の一部を取得するJavaScript定義が作成できました。
JavaScript定義の作成について、詳しくは以下のドキュメントをご覧ください。
作成したユーザ定義を利用して、ロジックフローを作成します。
入力値のURLと正規表現から、文字列を抽出し返却するロジックフローを作成してみます。
入出力設定
入力には以下を設定してください。
パラメータとデータ型 | 説明 |
---|---|
url |
取得したいHTMLのURLです。 |
regexp |
正規表現です。 |
出力には以下を設定してください。
パラメータとデータ型 | 説明 |
---|---|
result |
正規表現で取得した文字列です。 |
ロジックフローの入出力設定について、詳しくは以下のドキュメントをご覧ください。
エレメントの配置とマッピング
作成したREST定義とJavaScript定義を配置します。
get HTML text エレメント は、作成したREST定義のエレメントです。
実行には url
が必要なので、マッピングしてください。
入力(始点) | 出力(終点) |
---|---|
input - url |
im_cookbook_122851_user_gethtml1 - url |
extract string エレメント は、作成したJavaScript定義のエレメントです。
実行には targetStr
と regexp
が必要なので、マッピングしてください。
入力(始点) | 出力(終点) |
---|---|
input - regexp |
im_cookbook_122851_user_regexp1 - regexp |
im_cookbook_122851_user_gethtml1 - body |
im_cookbook_122851_user_regexp1 - targetStr |
End エレメント
extract string エレメントで取得した結果を、ロジックフローの出力として返却してください。
入力(始点) | 出力(終点) |
---|---|
im_cookbook_122851_user_regexp1 - result |
Output - result |
これで、HTMLから任意の文字列を取得するロジックフローが完成しました。
エレメントの配置やマッピング設定について、詳しくは以下のドキュメントをご覧ください。
デバッグ実行
正しく動作するか、デバッグ実行で確認してみます。
入力には以下を入力してください。
パラメータ名 | 入力値 |
---|---|
url |
http://caucho.com/products/resin/download |
regexp |
http://caucho.com/download/resin-pro-(.+?).zip |
url
に指定したURLはResinのダウンロードサイトです。
フローの実行に成功すると、Resinの最新バージョンをHTMLから取得できます。
ロジックフローのデバッグについて、詳しくは以下のドキュメントをご覧ください。
注意事項
Accel Platformがプロキシ環境で動作している場合は、REST定義が動作しないことがあります。
実行時は非プロキシ環境で実施してください。
または、 %RESIN_HOME%/conf/resin.properties
に以下のようなプロキシ設定を追加することで、プロキシ環境下でも実行することができます。
このCookBookを執筆する際は、以下のようにJVM引数にプロキシに関する設定を追加しました。
1 2 3 |
vm_args : %既存のJVM引数% \ -Dhttp.proxyHost=%プロキシサーバのホスト% -Dhttp.proxyPort=%プロキシサーバのポート% -Dhttp.nonProxyHosts=localhost \ -Dhttps.proxyHost=%プロキシサーバのホスト% -Dhttps.proxyPort=%プロキシサーバのポート% -Dhttps.nonProxyHosts=localhost |
おわりに
弊社では、このCookBookで紹介したユーザ定義を利用して、 Accel Platform で利用しているサードパーティライブラリのバージョンアップ監視を行っています。
ジョブスケジューラで監視フローを定期実行し、監視の結果が毎日IMBoxに投稿されています。
IM-LogicDesignerを利用すれば、IMBoxへの投稿や他システムとの連携も容易に実現できます。
今後、弊社で利用している監視システム全体について、CookBookの執筆を予定しておりますので、今しばらくお待ち下さい。