У меня есть предварительные запросы с 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.
Я попытался дождаться завершения h2hRequest и установить коллекцииVariables и переменные вне области pm.sendRequest. Тоже не помогает
Я запутался в ваших объяснениях, можете ли вы нарисовать диаграмму для входов h2hRequest и updateInfoRequest, выходов с идентификатором заказа, хотите зациклить или каскадировать вызов. Получить решение будет легко.
Извините, сегодня не могу нарисовать. Получил h2hRequest и updateInfoRequest. updateInfoRequest должен иметь orderId из ответа h2hRequest. Поэтому я запускаю h2hRequest, и updateInfoRequest ждет из-за функции setTimeout. h2hRequest получает ответ с orderId и вставляет этот идентификатор в тело updateInfoRequest. Тайм-аут следующего updateInfoRequest истек и запускается с идентификатором orderId в теле. Первый запуск h2hRequest получает ответ с ПЕРВЫМ orderId, но FIRST orderId не заполняется в теле updateInfoRequest. Второй запуск h2hRequest получает ответ со SECOND orderId, но orderId заполняется ПЕРВЫМ значением.
Я рисую диаграмму этот обзор верен? Следующий вопрос: вы хотите запустить цикл по идентификатору заказа на изменение с двумя запросами при сборе данных?
Да, ваша схема верна. И идентификатор заказа разный при каждом запуске.
Я ответил на ваш вопрос, надеюсь решить вашу проблему.





Я сделал два запроса со скриптами для получения/установки переменных коллекции.
Запрос на вызов цикла будет зависеть от переменных.
Все переменные обрабатываются на Pre request или Post Request (в старой версии это вкладка тестов)
Collection Variables : Blue
Call Order : Red
Pre Request/Post Response :Circle Blue
Request : Green
Start or End : Orange
orderIdh2hRequest ответа 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}`);
});
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"
}
]
}
После импорта
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). И я не понимаю, почему это происходит (
Спасибо, что нашли дефект в моих скриптах. Я исправил, попробуй еще раз. Это была неправильная проверка пост-ответа updateInfoRequest. Следует проверить длину orderIds вместо orderId. Я также обновил обзорное изображение.
Извините, что это не помогает. У меня все еще есть ошибка с неопределенным (читаю «setNestRequest»)
Вы попробовали еще раз? дайте мне знать, что ваша находка адресована или нет.
Вам нужно импортировать файл моей новой коллекции и повторить попытку. это означает, что сначала запустите макет-сервер, а затем запустите сбор.
Да, я попробовал еще раз. Почтальон и ноутбук были перезагружены, при простом запросе и сборе возникла эта ошибка.
Вы видели сообщение «Это последний шаг» в журнале консоли, когда я прикрепил последнее изображение?
Вам необходимо сбросить все значения коллекции в разделе update. Я думаю, вы пропустили этот шаг.
Сброшены значения коллекции, снова «Невозможно прочитать свойства неопределенного значения (чтение 'setNextRequest')». Я думаю, возможно, это проблема моей виртуальной машины
Это может быть проблема со старым почтальоном. Можете ли вы попробовать не виртуальную машину, а последнюю версию Postman v11.1.3?
Для 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.
P.S. Почтальон для Windows версии 10.10.9. Работает без подключения к Интернету. Я не могу обновить версию в соответствии с политикой компании.