web-dev-qa-db-fra.com

Postman - Comment boucler la demande jusqu'à ce que je reçoive une réponse spécifique?

Je teste l'API avec Postman et j'ai un problème: ma requête va à une sorte de middleware, donc je reçois un JSON de plus de 1000 lignes, ou je reçois le statut PENDING et un tableau vide de résultats:

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

La question est de savoir comment boucler cette requête dans Postman jusqu'à ce que je reçois le statut SUCCESS et le tableau de résultats> 0. Lorsque j'envoie ces demandes manuellement, une par une, c'est correct, mais lorsque je les exécute via Collection Runner, "PENDING" gâche tout.

3

En attendant que les services soient prêts ou en recherchant des résultats de travail de longue durée, je vois 4 options de base:

  1. Utilisez Postman Collection Runner ou Newman et définissez un délai par étape. Ce délai est inséré entre chaque étape de la collection. Deux défis à relever: il peut être fragile à moins que vous ne fixiez le délai à une valeur que la durée de la demande ne dépassera jamais ET, fréquemment, seul un petit nombre d’étapes a besoin de ce délai et vous augmentez la durée totale de l’essai, ce qui crée des temps de construction excessifs pour un serveur de build commun retardant d'autres builds en attente.
  2. Utilisez https://postman-echo.com/delay/10où le dernier élément de l'URI est le nombre de secondes à attendre. Ceci est simple et concis et peut être inséré en une seule étape après la demande à exécution longue. Le problème est que si la durée de la demande varie considérablement, vous risquez d’obtenir de faux échecs car vous n’avez pas attendu assez longtemps.
  3. Recommencez la même étape jusqu'à la réussite avec postman.setNextRequest(request.name);. Le défi ici est que Postman exécute la requête aussi vite que possible, ce qui peut DDoS votre service, vous met sur la liste noire (et provoque de fausses défaillances), et consomme beaucoup de ressources processeur s’il est exécuté sur un serveur de compilation commun - ralentissement des autres construit.
  4. Utilisez setTimeout () dans un script de pré-demande . Le seul inconvénient de cette approche est que si vous avez plusieurs étapes nécessitant cette logique, vous vous retrouvez avec du code copier-coller que vous devez garder synchronisé.

Note : il y a des variations mineures sur celles-ci - comme les définir sur une collection, un dossier de collection, une étape, etc.

J'aime l'option 4 car elle fournit le niveau de granularité approprié dans la plupart des cas. Notez que cela semble être le seul moyen de "dormir" dans un script Postman. Désormais, les méthodes de veille javascript standard, telles que Promise avec async et wait, ne sont pas prises en charge et l'utilisation de la fonction lodash _.delay(function() {}, delay, args[...]) du bac à sable ne conserve pas l'exécution du script sur le script de pré-demande.

Dans Postman Standalone App v6.0.10, définissez votre script de pré-requête de l'étape sur:

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);

Et vous pouvez faire vos tests standard en même temps.

Remarque : Les restrictions standard s'appliquent pour rendre retryLimit large.

2
Steve Tarver

Essaye ça:

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

Je cherchais une réponse à la même question et je pensais à une solution possible en lisant votre question. Utilisez le flux de travail du facteur pour réexécuter votre demande chaque fois que vous ne recevez pas la réponse que vous recherchez. En tout cas, c'est ce que je vais essayer.

postman.setNextRequest("request_name");

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

1
tkb608