web-dev-qa-db-ja.com

Postman-特定の応答が得られるまでリクエストをループする方法は?

私はPostmanでAPIをテストしていますが、問題があります。私のリクエストが一種のミドルウェアに送られるため、完全な1000行以上のJSONを受け取るか、PENDINGステータスと空の結果の配列を受け取ります。

{
  "meta": {
    "status": "PENDING",
    "missing_connectors_count": 0,
    "xxx_type": "INTERNATIONAL"
  },
  "results": []
}

問題は、ステータスSUCCESSと結果array > 0が表示されるまで、この要求をPostmanでループする方法です。これらのリクエストを1つずつ手動で送信する場合は問題ありませんが、Collection Runnerを介して実行する場合は、「PENDING」がすべてを混乱させます。

9

サービスの準備が整うのを待つとき、または長時間実行されるジョブの結果をポーリングするとき、4つの基本的なオプションが表示されます。

  1. Postmanコレクションランナーまたはnewmanを使用して、ステップごとの遅延を設定します。この遅延は、コレクションのすべてのステップの間に挿入されます。ここでの2つの課題:遅延をリクエストの継続時間を超えない値に設定しない限り、脆弱になる可能性があります。また、多くの場合、少数のステップのみがその遅延を必要とし、合計テスト実行時間が増加し、過度のビルド時間が作成されます。他の保留中のビルドを遅らせる一般的なビルドサーバー。
  2. _https://postman-echo.com/delay/10_を使用します。最後のURI要素は待機する秒数です。これはシンプルで簡潔であり、長時間実行されているリクエストの後に単一のステップとして挿入できます。課題は、リクエストの期間が大幅に異なる場合、十分に待機しなかったために誤ったエラーが発生する可能性があることです。
  3. 成功するまで同じ手順を再試行 with postman.setNextRequest(request.name);。ここでの課題は、Postmanがリクエストをできる限り速く実行して、サービスをDDoSし、ブラックリストに登録し(そして誤った失敗を引き起こし)、一般的なビルドサーバーで実行すると大量のCPUを消費する-他の処理が遅くなることです。ビルド。
  4. 事前要求スクリプトでsetTimeout()を使用。このアプローチで私が目にする唯一の欠点は、このロジックを必要とするいくつかのステップがある場合、同期を維持する必要があるいくつかのカット&ペーストコードが作成されることです。

:これらにはマイナーなバリエーションがあります-コレクション、コレクションフォルダー、ステップなどでの設定など。

オプション4は、ほとんどの場合に適切なレベルの細分性を提供するため、気に入っています。これがPostmanスクリプトで「スリープ」する唯一の方法であるように見えることに注意してください。現在、Promise with async and awaitなどの標準のjavascriptスリープメソッドはサポートされておらず、サンドボックスのlodash _.delay(function() {}, delay, args[...])を使用しても、事前リクエストスクリプトでのスクリプト実行は維持されません。

Postmanスタンドアロンアプリv6.0.10で、ステップ事前リクエストスクリプトを次のように設定します。

_console.log('Waiting for job completion in step "' + request.name + '"');

// Construct our request URL from environment variables
var url = request['url'].replace('{{Host}}', postman.getEnvironmentVariable('Host'));
var retryDelay = 1000;
var retryLimit = 3;

function isProcessingComplete(retryCount) {
    pm.sendRequest(url, function (err, response) {
        if(err) {
            // hmmm. Should I keep trying or fail this run? Just log it for now.
            console.log(err);
        } else {
            // I could also check for response.json().results.length > 0, but that
            // would omit SUCCESS with empty results which may be valid
            if(response.json().meta.status !== 'SUCCESS') {
                if (retryCount < retryLimit) {
                    console.log('Job is still PENDING. Retrying in ' + retryDelay + 'ms');
                    setTimeout(function() {
                        isProcessingComplete(++retryCount);
                    }, retryDelay);
                } else {
                    console.log('Retry limit reached, giving up.');
                    postman.setNextRequest(null);
                }
            }
        }
    });
}

isProcessingComplete(1);
_

また、同じ手順で標準テストを実行できます。

:retryLimitを大きくすると、標準の警告が適用されます。

2
Steve Tarver

これを試して:

var body = JSON.parse(responseBody);

if (body.meta.status !== "SUCCESS" && body.results.length === 0){
  postman.setNextRequest("This_same_request_title");
} else {
  postman.setNextRequest("Next_request_title"); 
  /* you can also try postman.setNextRequest(null); */  
}
2
Dinesh Kumar

私はあなたの質問を読んでいるときに、同じ質問への答えを探していて、可能な解決策を考えていました。 postmanワークフローを使用して、探している応答が得られない場合は常に要求を再実行します。とにかく、それを試してみるつもりです。

postman.setNextRequest("request_name");

https://www.getpostman.com/docs/workflows

1
tkb608