Переменная коллекции не обновляется в Postman

У меня есть предварительные запросы с 14:00.sendRequest. Один из них зависит от переменной из первого ответа. Они работают с setTimeout.

//I set Timeout because updateInfoRequest needs to wait and get it from h2hRequest response
setTimeout("updateInfo", 3000)

updateInfoBody = {"orderId":pm.collectionvariables.get("orderId")}

updateInfoRequest = {
there is connection info
body:JSON.stringify(updateInfoBody)
}

pm.sendRequest(h2hRequest, function(error, h2hResponse){
pm.collectionvariables.set(h2hResponse.json().orderId
})

function updateInfo(){
pm.sendRequest(updateInfoRequest, function(error, updateInfoResponse){
})
}

h2hRequest работает. Он принимает идентификатор заказа. Он не помещает переменную orderId после первого вызова. Но я вижу значение в переменных коллекции. Если запустить еще раз - orderId будет в переменной. Но это последний приказ, и он не новый.

Я использую только вкладку «Запрос», а не поток или что-то еще.

Как сделать так, чтобы предварительный запрос каждый раз получал новый идентификатор заказа?

команды очистки или отмены не помогают.

Локальная переменная предварительного запроса отвечает на ReferenceError.

P.S. Почтальон для Windows версии 10.10.9. Работает без подключения к Интернету. Я не могу обновить версию в соответствии с политикой компании.

Igor Martakov 17.05.2024 11:32

Я попытался дождаться завершения h2hRequest и установить коллекцииVariables и переменные вне области pm.sendRequest. Тоже не помогает

Igor Martakov 17.05.2024 12:32

Я запутался в ваших объяснениях, можете ли вы нарисовать диаграмму для входов h2hRequest и updateInfoRequest, выходов с идентификатором заказа, хотите зациклить или каскадировать вызов. Получить решение будет легко.

Bench Vue 17.05.2024 15:28

Извините, сегодня не могу нарисовать. Получил h2hRequest и updateInfoRequest. updateInfoRequest должен иметь orderId из ответа h2hRequest. Поэтому я запускаю h2hRequest, и updateInfoRequest ждет из-за функции setTimeout. h2hRequest получает ответ с orderId и вставляет этот идентификатор в тело updateInfoRequest. Тайм-аут следующего updateInfoRequest истек и запускается с идентификатором orderId в теле. Первый запуск h2hRequest получает ответ с ПЕРВЫМ orderId, но FIRST orderId не заполняется в теле updateInfoRequest. Второй запуск h2hRequest получает ответ со SECOND orderId, но orderId заполняется ПЕРВЫМ значением.

Igor Martakov 17.05.2024 18:02

Я рисую диаграмму этот обзор верен? Следующий вопрос: вы хотите запустить цикл по идентификатору заказа на изменение с двумя запросами при сборе данных?

Bench Vue 17.05.2024 18:24

Да, ваша схема верна. И идентификатор заказа разный при каждом запуске.

Igor Martakov 18.05.2024 06:31

Я ответил на ваш вопрос, надеюсь решить вашу проблему.

Bench Vue 18.05.2024 16:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
7
165
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обзор

Я сделал два запроса со скриптами для получения/установки переменных коллекции. Запрос на вызов цикла будет зависеть от переменных. Все переменные обрабатываются на Pre request или Post Request (в старой версии это вкладка тестов)

Цветовые коды

Collection Variables : Blue

Call Order : Red

Pre Request/Post Response :Circle Blue

Request : Green

Start or End : Orange

Переменные коллекции

Переменная Начальное значение Текущая стоимость идентификаторы заказов [1001, 1002, 1003] [1001, 1002, 1003] номер заказа 1001 1001 ответордерид нулевой нулевой
  • orderIds: массив данных, назначит orderId
  • orderId: вызовет входной запрос h2hRequest.
  • responseOrderId: анализ h2hRequest ответа JSON после вызова.

Мок-сервер

Предоставляет два API

h2hЗапрос

orderId

GET /h2h/?{orderId}

URL

{
    "orderId": "{Order ID}",
    "name": "Name {Order ID}",
    "description": "Get Order"
}

обновлениеинформорекуест

Response

POST /update-info/

URL

{
    "orderId": {Order ID},
    "name": "Name {Order ID}"
}

Input Body

{
    "orderId": {Order ID},
    "name": "Name {Order ID}",
    "description": "Update Order"
}

Response

const express = require('express');
const app = express();
const port = 3000;

app.use(express.json()); // To parse JSON bodies

// GET /h2h endpoint
app.get('/h2h', (req, res) => {
    const orderId = req.query.orderId;
    if (orderId === undefined || orderId === null) {
        return res.status(400).json({ error: 'orderId is required' });
    }
    console.info("/h2h" + orderId);
    res.json({
        orderId: orderId,
        name: `Name ${orderId}`,
        description: 'Get Order'
    });
});

// POST /update-info endpoint
app.post('/update-info', (req, res) => {
    const { orderId } = req.body;
    if (orderId === undefined || orderId === null) {
        return res.status(400).json({ error: 'orderId is required' });
    }
    console.info("/update-info" + orderId);
    res.json({
        orderId: orderId,
        name: `Name ${orderId}`,
        description: 'Update Order'
    });
});

app.listen(port, () => {
    console.info(`Server is running on http://localhost:${port}`);
});

Установить зависимость. Запустить Mock Server.

npm install express
node mock-server.js

Клиент-почтальон

Импортируйте это mock-server.js от Postman

{
    "info": {
        "_postman_id": "4c3eea37-233b-403d-b6db-b4810d80bc9a",
        "name": "1-demo",
        "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
        "_exporter_id": "1826150"
    },
    "item": [
        {
            "name": "h2hRequest",
            "event": [
                {
                    "listen": "test",
                    "script": {
                        "exec": [
                            "const responseJson = pm.response.json();\r",
                            "pm.collectionVariables.set(\"responseOrderId\", responseJson.orderId)\r",
                            "\r",
                            "console.info(\"responseOrderId: \" + pm.collectionVariables.get(\"responseOrderId\"))\r",
                            ""
                        ],
                        "type": "text/javascript",
                        "packages": {}
                    }
                },
                {
                    "listen": "prerequest",
                    "script": {
                        "exec": [
                            "let orderIds = JSON.parse(pm.collectionVariables.get(\"orderIds\"));\r",
                            "pm.collectionVariables.set(\"orderId\", orderIds.shift())\r",
                            "pm.collectionVariables.set(\"orderIds\", JSON.stringify(orderIds));\r",
                            "orderIds = JSON.parse(pm.collectionVariables.get(\"orderIds\"));\r",
                            "\r",
                            "if (pm.collectionVariables.get(\"orderId\")){\r",
                            "    pm.execution.setNextRequest(\"updateInfoRequest\"); // <- Next Request Name\r",
                            "} else {\r",
                            "    console.info(\"End\")\r",
                            "    pm.execution.setNextRequest(null);\r",
                            "}"
                        ],
                        "type": "text/javascript",
                        "packages": {}
                    }
                }
            ],
            "request": {
                "method": "GET",
                "header": [],
                "url": {
                    "raw": "http://localhost:3000/h2h?orderId = {{orderId}}",
                    "protocol": "http",
                    "host": [
                        "localhost"
                    ],
                    "port": "3000",
                    "path": [
                        "h2h"
                    ],
                    "query": [
                        {
                            "key": "orderId",
                            "value": "{{orderId}}"
                        }
                    ]
                }
            },
            "response": []
        },
        {
            "name": "updateInfoRequest",
            "event": [
                {
                    "listen": "prerequest",
                    "script": {
                        "exec": [
                            ""
                        ],
                        "type": "text/javascript",
                        "packages": {}
                    }
                },
                {
                    "listen": "test",
                    "script": {
                        "exec": [
                            "let orderIds = JSON.parse(pm.collectionVariables.get(\"orderIds\"));\r",
                            "\r",
                            "if (orderIds.length > 0){\r",
                            "    pm.execution.setNextRequest(\"h2hRequest\"); // <- next GET Request Name\r",
                            "} else {\r",
                            "    console.info(\"This is final step\")\r",
                            "    pm.execution.setNextRequest(null);\r",
                            "}"
                        ],
                        "type": "text/javascript",
                        "packages": {}
                    }
                }
            ],
            "request": {
                "method": "POST",
                "header": [],
                "body": {
                    "mode": "raw",
                    "raw": "{\r\n    \"orderId\": {{responseOrderId}},\r\n    \"name\": \"Name {{responseOrderId}}\"\r\n}",
                    "options": {
                        "raw": {
                            "language": "json"
                        }
                    }
                },
                "url": {
                    "raw": "http://localhost:3000/update-info",
                    "protocol": "http",
                    "host": [
                        "localhost"
                    ],
                    "port": "3000",
                    "path": [
                        "update-info"
                    ]
                }
            },
            "response": []
        }
    ],
    "event": [
        {
            "listen": "prerequest",
            "script": {
                "type": "text/javascript",
                "exec": [
                    ""
                ]
            }
        },
        {
            "listen": "test",
            "script": {
                "type": "text/javascript",
                "exec": [
                    ""
                ]
            }
        }
    ],
    "variable": [
        {
            "key": "orderIds",
            "value": "[1001, 1002, 1003]",
            "type": "string"
        },
        {
            "key": "orderId",
            "value": "1001",
            "type": "string"
        },
        {
            "key": "responseOrderId",
            "value": "null"
        }
    ]
}

После импорта

  • Примечание. Подождать 3000 (3 секунды) нет необходимости, поскольку ответ 1-demo.postman_collection.json даже в этом случае требует длительного времени обработки. мы просто берем идентификатор заказа из ответа JSON.

h2hRequest

GET http://localhost:3000/h2h?orderId = {{orderId}}

В h2hRequest h2hRequest

let orderIds = JSON.parse(pm.collectionVariables.get("orderIds"));
pm.collectionVariables.set("orderId", orderIds.shift())
pm.collectionVariables.set("orderIds", JSON.stringify(orderIds));
orderIds = JSON.parse(pm.collectionVariables.get("orderIds"));

if (pm.collectionVariables.get("orderId")){
    pm.execution.setNextRequest("updateInfoRequest"); // <- Next Request Name
} else {
    console.info("End")
    pm.execution.setNextRequest(null);
}

В h2hRequest Pre-request

const responseJson = pm.response.json();
pm.collectionVariables.set("responseOrderId", responseJson.orderId)

console.info("responseOrderId: " + pm.collectionVariables.get("responseOrderId"))

Post-response

POST http://localhost:3000/update-info

updateInfoRequest с опцией Input Body JSON

{
    "orderId": {{responseOrderId}},
    "name": "Name {{responseOrderId}}"
}

В updateInfoRequest raw

let orderIds = JSON.parse(pm.collectionVariables.get("orderIds"));

if (orderIds.length > 0){
    pm.execution.setNextRequest("h2hRequest"); // <- next GET Request Name
} else {
    console.info("This is final step")
    pm.execution.setNextRequest(null);
}

Запустить сбор

Результат

Post-response вызывается элементами числового массива h2hRequest, каждый из которых отличается orderIds


Обновлять

Если вы хотите повторно запустить сбор

Вам следует сбросить все коллекции orderId как красный прямоугольник

orderIds : [1001, 1002, 1003] 
orderId : 1001 
responseOrderId : null 

Ваш ответ потрясающий! Большое спасибо. Это работает для пары запросов. При следующих запусках возникает ошибка: невозможно прочитать свойства undef (чтение setNextRequest). И я не понимаю, почему это происходит (

Igor Martakov 19.05.2024 10:12

Спасибо, что нашли дефект в моих скриптах. Я исправил, попробуй еще раз. Это была неправильная проверка пост-ответа updateInfoRequest. Следует проверить длину orderIds вместо orderId. Я также обновил обзорное изображение.

Bench Vue 19.05.2024 12:12

Извините, что это не помогает. У меня все еще есть ошибка с неопределенным (читаю «setNestRequest»)

Igor Martakov 19.05.2024 12:20

Вы попробовали еще раз? дайте мне знать, что ваша находка адресована или нет.

Bench Vue 19.05.2024 12:22

Вам нужно импортировать файл моей новой коллекции и повторить попытку. это означает, что сначала запустите макет-сервер, а затем запустите сбор.

Bench Vue 19.05.2024 12:27

Да, я попробовал еще раз. Почтальон и ноутбук были перезагружены, при простом запросе и сборе возникла эта ошибка.

Igor Martakov 19.05.2024 12:27

Вы видели сообщение «Это последний шаг» в журнале консоли, когда я прикрепил последнее изображение?

Bench Vue 19.05.2024 12:28

Вам необходимо сбросить все значения коллекции в разделе update. Я думаю, вы пропустили этот шаг.

Bench Vue 19.05.2024 12:35

Сброшены значения коллекции, снова «Невозможно прочитать свойства неопределенного значения (чтение 'setNextRequest')». Я думаю, возможно, это проблема моей виртуальной машины

Igor Martakov 19.05.2024 13:25

Это может быть проблема со старым почтальоном. Можете ли вы попробовать не виртуальную машину, а последнюю версию Postman v11.1.3?

Bench Vue 19.05.2024 13:27

Для Postman 10.10.9 я нашел решение. setTimeout for updateInfo function updateInfo(){ pm.sendRequest({Put all request info in here}, function(error, updateInfoResponse){ })} OrderId не обновляется, если я объявлю updateInfoRequest не в тайм-ауте sendReques. setNestRequest не работает в моем старом Postman.

Igor Martakov 20.05.2024 09:40

Другие вопросы по теме