コールバックの変更
非同期通信をサポートするプロトコルのリストについては,「64 ビットの記録,非同期,および IPv6 に対するプロトコル・サポート」を参照してください。
VuGen が仮想ユーザ・スクリプトで非同期通信をスキャンした後,デザイン・スタジオの[非同期]タブにスクリプトで見つかった非同期会話をリストします。スキャン中に見つかった非同期会話ごとに,VuGen は AsyncCallbacks.c ファイルの必要なコールバック関数宣言を追加します。必要な動作を実装するために,VuGen によって追加されたコールバックを変更できます。コールバックの変更には,次のものがあります。
ポーリング会話およびロング・ポーリング会話では,要求された URL は,多くの場合,ポーリングの繰り返しごとに変わります。通常,変更はクライアント側のロジックで決定され,通常,ブラウザで実行される JavaScript で実装されます。URL の一部は,セッション ID などの既知のパラメータの相関で決まる場合があります。詳細については,「URL の解析」 を参照してください。
RequestCB および web_util_set_request_url 関数を使用して要求が送信される前に,非同期会話の要求の URL が変更されます。
要求が送信される前に,非同期会話の一部である要求の要求ボディを変更する必要がある場合があります。要求ボディを変更するには,RequestCB および web_util_set_request_body ユーティリティ関数を使用します。
要求ボディの変更は,新しい要求ごとに異なる要求ボディが必要な,ポーリング会話およびロング・ポーリング会話で役立ちます。
VuGen によって生成される各 RequestCB にはコメント化されたスニペットが含まれます。スニペットを「コメント解除」すると,web_util_set_request_body ユーティリティ関数を使用できます。
記録された会話で異なる要求が異なるボディ値を持つことが検出された場合,生成された RequestCB には,スクリプトを実行するときに,各要求ごとに要求のボディの送信を実装するため,記録を確認することを要求するコメントが含まれます。
非同期会話の応答コールバックを変更して,応答の有効性を検証するか,特定のイベントを待機することができます。たとえば,各応答の応答ヘッダを検査して,特定の値を受信しているかを判別できます。
予期した値を受信している場合は,アクション・ファイル内の web_stop_async ステップを使用して非同期会話を終了できます。
次のコード・サンプルは,非同期会話の終了の例を示しています。この例では,AsyncCallback.c ファイルのスクリプトにより, 10 回のポーリング会話の反復がカウントされ,その後 stopAsync という新しいパラメータが作成されます。
例:
int Poll_0_ResponseCB(
...{
//increment iteration counter for every response received.
static int iter = 0;
iter++;
//Once the desired number of responses has been reached,
//create and save the parameter.
if (iter > 10) {
lr_save_int(iter, "stopAsync");
}
return WEB_ASYNC_CB_RC_OK;
}
アクション・ファイルで,web_sync ステップが生成されたパラメータ stopAsync を使用して,会話を終了します。
例:
web_reg_async_attributes("ID=Poll_0","Pattern=Poll",
"URL=http://pumpkin:2080/nioamfpoll;AMFSessionId=6F8D6108-E309-38B2-3D65-963B431D0A38",
"PollIntervalMs=3000",
"RequestCB=Poll_0_RequestCB",
"ResponseCB=Poll_0_ResponseCB",
LAST);
web_custom_request("nioamfpoll;AMFSessionId=6F8D6108-E309-38B2-3D65-963B431D0A38_2",
"URL=http://pumpkin:2080/nioamfpoll;AMFSessionId=6F8D6108-E309-38B2-3D65-963B431D0A38",
"Method=POST",
"Resource=0",
"RecContentType=application/x-amf",
"Referer=http://pumpkin:8081/lcds-samples/traderdesktop/traderdesktop.swf/[[DYNAMIC]]/3",
"Snapshot=t11.inf",
"Mode=HTML",
"EncType=application/x-amf",
"BodyBinary=\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x04null\\x00\\x02/6\\x00\\x00\\x00Z\n\\x00\\x00\\x00\\x01\\x11\n\\x07\\x07DSC\\x8D\\x02\n\\x0B\\x01\\x01\\x06\\x01\n\\x05\tDSId\\x06I6F8D611E-DC1C-9D0C-2BBA-36CC2AB8633B\\x01\\x0C!\\xC0\\xBE\\xA6Z74\\xBE\\xC3\\xCF\\xC7\\xFA\\xE6\\xC3\t\\xE2\\x92\\x01\\x06\\x01\\x01\\x04\\x02",
LAST);
lr_think_time(30);
//suspend the script until the desired number
//of iterations have been performed.
web_sync("ParamCreated=stopAsync", "RetryIntervalMs=1000", "RetryTimeoutMs=300000", LAST);
web_stop_async("ID=Poll_0",LAST);
非同期会話の終了の詳細については,「非同期会話の終了の定義」を参照してください。
Flex 非同期ポーリングおよびロング・ポーリング会話に対しては,AsyncCallback.c ファイル内に生成された RequestCB に,各要求に対して XML 形式の要求ボディを設定する web_util_set_formatted_request_body への呼び出しが含まれます。
例: web_util_set_formatted_request_body("<AMFPacket AMF_version=\"3\">"
"<AMFHeaders />"
"<Messages>"
"<Message method=\"null\" target=\"/{Target_Poll_0}\">"
…
"</Message>"
"</Messages>"
"</AMFPacket>");
TODO セクションのコメント化されたコードのコメントを解除し,コールバック・コードを追加したら,スクリプト・デザイン・スタジオを開いて相関をスキャンします。
コードの生成により,要求ボディのターゲット・パラメータが自動的にパラメータ化されることに注意してください。各ポーリング反復が実行される前にこのパラメータを自動的に増分するコードも生成されます。
生成された RequestCB には,アクション・ファイル内の Target_Poll_0 のカウンタ初期化パラメータが最初のポーリング要求の最初の Message 要素に含まれるターゲット属性に一致することを確認するように求めるメッセージも含まれます。
例: lr_param_increment("Target_Poll_0", "{Target_Poll_0}");
web_util_set_formatted_request_body("<AMFPacket AMF_version=\"3\">"
"<AMFHeaders />"
"<Messages>"
"<Message method=\"null\" target=\"/{Target_Poll_0}\">"
…
アクション・ファイルで,AsyncCallbacks.c で使用される同一のポーリング・パラメータを初期化します。アクション・ファイルに含まれる次のセグメントでは,ポーリング・パラメータ Target_Poll_0 が AsyncCallbacks.c で使用されるパラメータと一致しています。
例:
/* Initialize target parameter before sending first request.*/
/* Notice that parameter will be incremented once before first request.*/
lr_save_int(5, "Target_Poll_0");
コールバック関数の使用方法の詳細については,「コールバックの実装」を参照してください。