Apidog では、Javascript 環境から外部プログラム(スクリプト、JAR、バイナリ)を実行できます。これにより、Java、Python、PHP、Go、Shell などの言語で作成された既存のコードを活用できます。外部プログラムは Apidog サンドボックスの外部で実行され、システムへの完全なアクセス権を持ちます。実行するコードが信頼できるものであることを確認してください。
サポートされている言語#
Apidog は、ファイル拡張子に基づいて実行コマンドを推測します。| 言語 | 拡張子 | コマンドプレフィックス |
|---|
| Java | .jar | java -jar |
| Python | .py | python |
| Node.js | .js | node |
| PHP | .php | php |
| Go | .go | go run |
| Shell | .sh | sh |
| Ruby | .rb | ruby |
| Lua | .lua | lua |
外部プログラムの呼び出し方法#
1.
外部プログラムディレクトリを開く: スクリプトエディターのフォルダーアイコンをクリックして、外部スクリプトを配置するディレクトリを開きます。 2.
スクリプト経由で実行する: pm.executeAsync を使用してプログラムを呼び出します。 API リファレンス#
pm.executeAsync#
filePath string 外部プログラムのパス
args string[] パラメータです。jar パッケージ内の指定メソッドを呼び出す場合、変換には JSON.stringify が使用されます。それ以外の場合、非 string 型は暗黙的に string に変換されます。
command string 外部プログ ラムの実行コマンドです。「コマンドプレフィックス」の最初の部分が実行コマンドです。任意項目で、デフォルト値は自動的に推測されます(上記の「コマンドプレフィックス」表を参照)。任意のプログラムにカスタマイズできます。
cwd string サブプロセスの作業ディレクトリです。任意項目で、デフォルトは「外部プログラムディレクトリ」です。
env Record<string, string> サブプロセスの環境変数です。任意項目で、デフォルトは {} です。
windowsEncoding string Windows システムで使用されるエンコーディングです。任意項目で、デフォルトは "cp936" です。
className string jar パッケージ内で呼び出すクラス名を指定します(例: "com.apidog.Utils")。
method string jar パッケージ内で呼び出すメソッド名を指定します(例: "add")。
paramTypes string[] jar パッケージ内で呼び出すメソッドのパラメータ型を指定します(例: ["int", "int"])。
デフォルトでは、Apidog は .py ファイルの実行に python を使用します。コンピューターに python3 がすでにインストールされている場合は、command を python3 として指定できます。 pm.execute#
代わりに pm.executeAsync を使用することを推奨します。
pm.execute(filePath, args, options)filePath string 外部プログラムのパス
args string[] パラメータです。jar パッケージ内の指定メソッドを呼び出す場合、変換には JSON.stringify が使用されます。それ以外の場合、非 string 型は暗黙的に string に変換されます。
windowsEncoding string Windows システムで使用されるエンコーディングです。任意項目で、デフォルトは "cp936" です。
className string jar パッケージ内で呼び出すクラス名を指定します(例: "com.apidog.Utils")。
method string jar パッケージ内で呼び出すメソッド名を指定します(例: "add")。
paramTypes string[] jar パッケージ内で呼び出すメソッドのパラメータ型を指定します(例: ["int", "int"])。
実行とログ#
プログラムを実行すると、実行されたコマンドがコンソールに出力されます(参考用のみ)。結果が期待どおりでない場合は、コマンドをコピーして Shell/CMD に貼り付け、デバッグできます。コンソールには、実行されたプロセスの「標準出力(stdout)」と「標準エラー出力(stderr)」も出力されます。stdout の内容(末尾の改行文字を除く)が、実行の最終結果になります。歴史的な理由により、pm.execute は stderr に内容がある場合、実行が失敗したものとして扱います。そのため、一部のプログラムでは警告やエラーメッセージを出力すると失敗します。pm.executeAsync では、プロセスの 終了コード を使用して実行が失敗したかどうかを判断するように変更されていま す。
外部プログラムの入力と出力#
パラメータ#
指定された外部プログラムはコマンドライン実行で動作するため、渡されたパラメータはコマンドライン引数を通じてのみ取得できます。たとえば、スクリプト pm.executeAsync('add.js', [2, 3]) では、実際に実行されるコマンドは node add.js 2 3 です。外部スクリプト add.js でパラメータを取得するには、次のよ うにします。1.
プログラミング言語によってコマンドライン引数の取得方法は異なります。対応する言語のドキュメントを参照してください。
2.
コマンドライン引数の型は常に string であるため、実際の型に基づいて変換する必要があります。
戻り値#
前述のとおり、Apidog は stdout の内容をプログラム実行の結果として使用します。そのため、stdout に内容を出力することで結果を返せます。たとえば、スクリプト const result = await pm.executeAsync('add.js', [2, 3]) では、次のように結果を返せます。1.
プログラミング言語によって stdout への出力方法は異なります。対応する言語のドキュメントを参照してください。
2.
戻り値の型は string であるため、実際の型に基づいて変換する必要があります。
4.
jar パッケージ内の指定メソッドを呼び出す場合、呼び出されたメソッドの戻り値が最終的な戻り値として使用されます。
エラーのスロー#
エラーをスローすると、現在のタスクを失敗させ、実行を停止できます。例:1.
プログラミング言語によってエラーのスロー方法は異なります。対応するドキュメントを参照してください。
2.
JavaScript では、console.error('Error') はエラーをスローするのではなく、stderr に出力するだけです。他の言語を使用する場合も、この点を考慮してください。
デバッグ情報#
pm.executeAsync は成功判定に stderr ではなく終了コードを使用するため、stderr は実行に影響を与えずにデバッグ情報を出力するために使用できます。1.
この方法でデバッグ情報を出力できるのは pm.executeAsync のみです。
2.
プログラミング言語によって stderr への出力方法は異なります。対応するドキュメントを参照してください。
pm.execute から pm.executeAsync への移行#
pm.executeAsync の戻り値は Promise 型であるため、execute を直接 executeAsync に変更することはできません。ただし、async/await を使用すれば、最小限の変更で移行できます。Apidog バージョン 2.3.24 以降(CLI バージョン 1.2.38 以降)はトップレベル await をサポートしています。
1.
execute を executeAsync に変更します
.jar パッケージ内の指定メソッドを呼び出す#
この機能には Apidog バージョン 2.1.39 以降が必要です。リフレクションによる jar の呼び出しのみをサポートしており、Spring Boot のように内部ランタイムリフレクションを使用する jar はサポートしていません。
デフォルトでは、jar を呼び出すと Main クラスの main メソッドが呼び出されます。options.className が指定されている場合、デフォルトの動作を上書きし、代わりに jar 内の指定メソッドを呼び出します。jar 内の指定メソッドの呼び出しは、他の外部プログラムとは異なります。Apidog は組み込みの実行プログラムを使用して、リフレクションにより jar 内のメソッドを見つけて呼び出します。呼び出されたメソッドに戻り値がある場合は、文字列に変換された後、最終的な戻り値として使用されます。それ以外の場合は、他の呼び出しと同様に、stdout の内容が戻り値として使用されます。ここで、<app-dist>/assets/JarExecuter-1.1.0-jar-with-dependencies.jar は組み込みの実行プログラムであり、ユーザープログラム ./scripts/jar-1.0-SNAPSHOT.jar 内のメソッド com.apidog.Test.combine(String,String) をリ フレクションで見つけ、パラメータ(JSON 文字列)"hello" と "world" を使用して呼び出す役割を担います。paramTypes は任意項目です。指定しない場合、型はパラメータに基づいて自動的に推測されます。整数は "int"、浮動小数点数は "double"、ブール値は "boolean"、文字列は "String"、配列は最初の要素に基づいて推測されます。たとえば、[3] は "int[]"、[3.14] は "double[]" と推測されます。
推測された型が、呼び出されるメソッドの実際のパラメータ型と一致しない場合は、paramTypes を手動で指定する必要があります。
paramTypes 配列でサポートされている値: "Number"、"int"、"Integer"、"long"、"Long"、"short"、"Short"、"float"、"Float"、"double"、"Double"、"boolean"、"Boolean"、"String"、"Number[]"、"int[]"、"Integer[]"、"long[]"、"Long[]"、"short[]"、"Short[]"、"float[]"、"Float[]"、"double[]"、"Double[]"、"boolean[]"、"Boolean[]"、"String[]"そのため、上記の例の paramTypes は省略できます。1. PHP プログラム#
2. Jar プログラム#
よくある問題#
1. 一部のプログラムではプロジェクト設定ファイルが必要であり、不足しているとエラーになります#
could not find `Cargo.toml` in `<...>/ExternalPrograms` or any parent directory
go.mod file not found in current directory or any parent directory; see 'go help modules'
解決策: pm.executeAsync を使用し、cwd を指定します。2. MacOS には Python 3 が組み込まれていますが、Python 2 はありません#
pm.executeAsync を使用し、command を "python3" に設定します。3. Command xxx not found#
対応するプログラムをインストールし、必要なディレクトリをシステム PATH に追加してください。Java のインストールについては docs を参照してください。4. 一部の Windows システムで外部スクリプトの呼び出し結果が文字化けして出力される#
windowsEncoding を 'utf-8' に設定します。