Postman 通过循环链接 API
Postman chaining APIs with looping
我有 3 个 API。
API#1 - GET {{endPoint}}/event/{{customerId}}/orders
API#2 - POST {{endPoint}}/pullOrders/{{orderId}}/claims
API#3 - DELETE {{endPoint}}/pullOrders/{{orderId}}/events
API#1 的响应是带有订单 ID 的 json。
{
"List": [
{
"OrderId": "c6882585",
"Type": "pull"
},
{
"OrderId": "a2f818e7",
"Type": "pull"
},
{
"OrderId": "1f45e306",
"Type": "pull"
}
]
}
API#2 的输入是来自 API#1 的响应的 orderId。
API#2 的响应是 json,partNumber 对应特定的 customerId。响应可能是 empty/null,partNumber 的数量与其他 customerId 不同。
[
{
"EventId": "46323beaf738",
"PartNumber": "22b188f7",
},
{
"EventId": "5024519db933",
"PartNumber": "2c2d8757",
}
]
这些partNumber被输入到它的正文中的API#3。
API#3
正文
{
"partNumberList": [22b188f7, 2c2d8757]
}
目标是通过链接 API#1、API#2 和 API#3 来删除客户的所有订单历史记录。
在 API#1 的测试中,我得到了测试中的所有 orderId 并将其保存在一个变量中。
const responseJson = pm.response.json();
var orderIdList = responseJson.List;
var orderIds = []
for(var index in orderIdList) {
orderIds.push(orderIdList[index].OrderId);
}
pm.variables.set("orderIds", JSON.stringify(orderIds));
pm.variables.set("orderIdsIndex", 0);
在 API#2 的预请求脚本中,我使用来自 API#1 的 orderId 设置对 API#2 的调用。
var orderIds = JSON.parse(pm.variables.get('orderIds'));
var index = parseInt(pm.variables.get('orderIdsIndex'));
pm.variables.set('orderId', orderIds[index]);
if (index + 1 < orderIds.length){
pm.variables.set('orderIdsIndex', index + 1);
postman.setNextRequest('API#2');
}else{
postman.setNextRequest(null);
}
到此为止一切都按预期工作,即 API#2 在循环中针对 3 个 orderId 调用了 3 次。
在 API#2 的测试中,我尝试了以下方法。当下面的 partNumbers
数组非空时,运行 停止。它调用 API#3 然后停止。我如何让它继续下一次迭代?
const responseJson = pm.response.json();
var partNumbers = [];
for (var key in responseJson){
partNumbers.push(responseJson[key].PartNumber);
}
pm.variables.set('partNumbers', JSON.stringify(partNumbers));
if (receiptHandles.length != 0) {
postman.setNextRequest('API#3');
}else{
postman.setNextRequest('API#2');
}
在 API#3 的正文中我有
{
"partNumberList": {{partNumbers}}
}
据我了解,你的问题是:
- API#1 --> “x”列表。
[x1, x2]
- 对于每个项目 (x) --> 调用 API#2 --> “y”列表
x1 --> [y1, y2]
x2 --> [y3, y4, y5]
- 对于每个项目 (y) --> 调用 API#3。
[y1, y2] --> DELETE [y1, y2]
然后停止执行
我的解决办法是:
在第 2 步中,您将 x
和 y
保存为
格式
[
{
"x1": ["y1", "y2"]
},
{
"x2": ["y3", "y4", "y5"]
}
]
在第 3 步中,您只需要在上述对象的列表中删除每个 x
和 y
示例代码: 在 API#2
的测试中
let listOfRequest;
if (pm.environment.get("listOfRequest") == undefined){
listOfRequest = [];
} else {
listOfRequest = JSON.parse(pm.environment.get("listOfRequest"));
}
const responseJson = pm.response.json();
let requestObj = {};
requestObj.orderId = _.random(0,100); // you can use your orderId
let y = [];
responseJson.forEach((element) => {
y.push(element.PartNumber);
});
requestObj.y = y;
listOfRequest.push(requestObj);
console.log(listOfRequest);
pm.environment.set('listOfRequest', JSON.stringify(listOfRequest));
//The array will be accumulated for each run of API#2
//1st: [{"orderId":1,"y":["111","222"]},
//2nd: [{"orderId":1,"y":["111","222"]},{"orderId":2,"y":["333","444","555"]}]
在 API#3
的预先请求中
// use same technique in pre-request API#2, loop in the array `listOfRequest`
为什么不能事先存储所有内容?
在API 1 测试使用:
//storing all orderids to a list
pm.variable.set("orderIDList",pm.response.json().List.map(elem=>elem.OrderId))
在 API2
的预先请求中
//Getting orderID from the list in the left to right order
let orderIDList = pm.variable.get("orderIDList")
pm.variables.set("orderId", orderIDList.shift())
pm.variables.set("orderIDList", orderIDList)
// Doing sendRequest till all orderIDs are executed
orderIDList.length ? postman.setNextRequest(pm.info.requestName):null
在API2
的测试脚本中
//storing PartNumber for each orderID as a List of object coontaining
//orderID:[partnumber1,partnumber2]
let obj = {}
obj[pm.variables.get("orderId")] = pm.response.json().map(elem=>elem.PartNumber)
let partNumberList = pm.variables.get("partNumberList")
partNumberList ? partNumberList.push(obj) : partNumberList=[obj]
pm.variables.set("partNumberList",partNumberList)
并在 API3
的预请求中
//sending each orderid with the full PartNumberList
let partNumberList = pm.variable.get("partNumberList")
let partNumberMap = partNumberList.shift()
pm.variables.set("orderId", Object.keys(partNumberMap).shift())
pm.variables.set("partNumbers", partNumberMap[orderId])
pm.variables.set("partNumberList", partNumberList)
partNumberList.length ? postman.setNextRequest(pm.info.requestName):null
我有 3 个 API。
API#1 - GET {{endPoint}}/event/{{customerId}}/orders
API#2 - POST {{endPoint}}/pullOrders/{{orderId}}/claims
API#3 - DELETE {{endPoint}}/pullOrders/{{orderId}}/events
API#1 的响应是带有订单 ID 的 json。
{
"List": [
{
"OrderId": "c6882585",
"Type": "pull"
},
{
"OrderId": "a2f818e7",
"Type": "pull"
},
{
"OrderId": "1f45e306",
"Type": "pull"
}
]
}
API#2 的输入是来自 API#1 的响应的 orderId。 API#2 的响应是 json,partNumber 对应特定的 customerId。响应可能是 empty/null,partNumber 的数量与其他 customerId 不同。
[
{
"EventId": "46323beaf738",
"PartNumber": "22b188f7",
},
{
"EventId": "5024519db933",
"PartNumber": "2c2d8757",
}
]
这些partNumber被输入到它的正文中的API#3。
API#3
正文{
"partNumberList": [22b188f7, 2c2d8757]
}
目标是通过链接 API#1、API#2 和 API#3 来删除客户的所有订单历史记录。
在 API#1 的测试中,我得到了测试中的所有 orderId 并将其保存在一个变量中。
const responseJson = pm.response.json();
var orderIdList = responseJson.List;
var orderIds = []
for(var index in orderIdList) {
orderIds.push(orderIdList[index].OrderId);
}
pm.variables.set("orderIds", JSON.stringify(orderIds));
pm.variables.set("orderIdsIndex", 0);
在 API#2 的预请求脚本中,我使用来自 API#1 的 orderId 设置对 API#2 的调用。
var orderIds = JSON.parse(pm.variables.get('orderIds'));
var index = parseInt(pm.variables.get('orderIdsIndex'));
pm.variables.set('orderId', orderIds[index]);
if (index + 1 < orderIds.length){
pm.variables.set('orderIdsIndex', index + 1);
postman.setNextRequest('API#2');
}else{
postman.setNextRequest(null);
}
到此为止一切都按预期工作,即 API#2 在循环中针对 3 个 orderId 调用了 3 次。
在 API#2 的测试中,我尝试了以下方法。当下面的 partNumbers
数组非空时,运行 停止。它调用 API#3 然后停止。我如何让它继续下一次迭代?
const responseJson = pm.response.json();
var partNumbers = [];
for (var key in responseJson){
partNumbers.push(responseJson[key].PartNumber);
}
pm.variables.set('partNumbers', JSON.stringify(partNumbers));
if (receiptHandles.length != 0) {
postman.setNextRequest('API#3');
}else{
postman.setNextRequest('API#2');
}
在 API#3 的正文中我有
{
"partNumberList": {{partNumbers}}
}
据我了解,你的问题是:
- API#1 --> “x”列表。
[x1, x2]
- 对于每个项目 (x) --> 调用 API#2 --> “y”列表
x1 --> [y1, y2]
x2 --> [y3, y4, y5]
- 对于每个项目 (y) --> 调用 API#3。
[y1, y2] --> DELETE [y1, y2]
然后停止执行
我的解决办法是:
在第 2 步中,您将 x
和 y
保存为
[
{
"x1": ["y1", "y2"]
},
{
"x2": ["y3", "y4", "y5"]
}
]
在第 3 步中,您只需要在上述对象的列表中删除每个 x
和 y
示例代码: 在 API#2
的测试中let listOfRequest;
if (pm.environment.get("listOfRequest") == undefined){
listOfRequest = [];
} else {
listOfRequest = JSON.parse(pm.environment.get("listOfRequest"));
}
const responseJson = pm.response.json();
let requestObj = {};
requestObj.orderId = _.random(0,100); // you can use your orderId
let y = [];
responseJson.forEach((element) => {
y.push(element.PartNumber);
});
requestObj.y = y;
listOfRequest.push(requestObj);
console.log(listOfRequest);
pm.environment.set('listOfRequest', JSON.stringify(listOfRequest));
//The array will be accumulated for each run of API#2
//1st: [{"orderId":1,"y":["111","222"]},
//2nd: [{"orderId":1,"y":["111","222"]},{"orderId":2,"y":["333","444","555"]}]
在 API#3
的预先请求中// use same technique in pre-request API#2, loop in the array `listOfRequest`
为什么不能事先存储所有内容?
在API 1 测试使用:
//storing all orderids to a list
pm.variable.set("orderIDList",pm.response.json().List.map(elem=>elem.OrderId))
在 API2
的预先请求中//Getting orderID from the list in the left to right order
let orderIDList = pm.variable.get("orderIDList")
pm.variables.set("orderId", orderIDList.shift())
pm.variables.set("orderIDList", orderIDList)
// Doing sendRequest till all orderIDs are executed
orderIDList.length ? postman.setNextRequest(pm.info.requestName):null
在API2
的测试脚本中//storing PartNumber for each orderID as a List of object coontaining
//orderID:[partnumber1,partnumber2]
let obj = {}
obj[pm.variables.get("orderId")] = pm.response.json().map(elem=>elem.PartNumber)
let partNumberList = pm.variables.get("partNumberList")
partNumberList ? partNumberList.push(obj) : partNumberList=[obj]
pm.variables.set("partNumberList",partNumberList)
并在 API3
的预请求中//sending each orderid with the full PartNumberList
let partNumberList = pm.variable.get("partNumberList")
let partNumberMap = partNumberList.shift()
pm.variables.set("orderId", Object.keys(partNumberMap).shift())
pm.variables.set("partNumbers", partNumberMap[orderId])
pm.variables.set("partNumberList", partNumberList)
partNumberList.length ? postman.setNextRequest(pm.info.requestName):null