【问题标题】:Postman chaining APIs with loopingPostman 使用循环链接 API
【发布时间】:2021-09-17 07:08:57
【问题描述】:

我有 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 的响应是带有 orderID 的 json。

{
    "List": [
        {
            "OrderId": "c6882585",
            "Type": "pull"
        },
        {
            "OrderId": "a2f818e7",
            "Type": "pull"
        },
        {
            "OrderId": "1f45e306",
            "Type": "pull"
        }
    ]
}

API#2 的输入是来自 API#1 响应的 orderId。 API#2 的响应是一个带有特定 customerId 的 partNumber 的 json。响应可能为空/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}}
}

【问题讨论】:

  • 为什么不能在调用第三个端点之前预先存储所有内容。为什么要回到 api2?

标签: postman postman-collection-runner postman-pre-request-script postman-testcase


【解决方案1】:

据我了解,您的问题是

  • API#1 --> "x" 列表。 [x1, x2]
  • 对于每个项目 (x) --> 调用 API#2 --> “y”列表 x1 --&gt; [y1, y2] x2 --&gt; [y3, y4, y5]
  • 对于每个项目 (y) --> 调用 API#3。 [y1, y2] --&gt; DELETE [y1, y2] 然后停止执行

我的解决方案是:

在第 2 步中,以格式保存 xy

[
    {
        "x1": ["y1", "y2"]
    },
    {
        "x2": ["y3", "y4", "y5"]
    }
]

在第 3 步中,您只需要在上述对象列表中的 for-each 删除每一对 xy

示例代码: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`

【讨论】:

  • partNumbers 不是问题所在。使用我的代码,我也正确地得到了partNumbers。然后问题是当partNumbers 为空时,运行停止。我希望它继续到下一次迭代。
  • @ontherocks 我现在明白了。我的解决方案是将所有partNumber 保留在一个变量中,然后您可以在数组中循环。我会更新我的答案。
  • partNumbers 不是这里的问题。我想我无法传达这个问题。我取得了一些进展。使用我在 OP 中更新的代码,它能够在 partNumber 为空时循环到 API#2,但现在当它非空时,它会调用 API#3 并停止运行。
  • @ontherocks 我更新了更多信息以澄清我的理解和我的解决方案。不用担心partNumbers,它只是一个名称,您可以根据自己的情况进行更改。
  • 感谢您的帮助。需要数组[y1, y2] [y3, y4, y5] 的列表,因为它们中的每一个都是orderId 的函数。 API#3 在请求中需要orderid。累积平面数组在这里不起作用。
【解决方案2】:

为什么你不能提前存储所有东西?

在 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 的 Pre request 中

//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

【讨论】:

  • 在API2的测试脚本中,我认为应该是let orderId = pm.variables.get("orderId"); obj[orderId] = pm.response.json().map(elem=&gt;elem.PartNumber)。也不应该是pm.variables.set("partNumberList", JSON.stringify(partNumberList)) 吗?同样在partNumberList ? partNumberList.push(obj) : [obj],应该是push()吗?
  • 您不必在存储到变量之前进行字符串化,因此当您检索它时,它已经是一个数组。不需要 json.parse。所有其他事情都是正确的,因为它是试一试:)
  • 在 API2 的测试脚本中我得到ReferenceError: orderId is not defined
  • 在 API3 的预请求中,我收到了 Cannot read property 'shift' of undefined
  • @ontherocks 你应该在 collection runner 中运行脚本你在 clllectio nrunner 中运行吗?
猜你喜欢
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 2021-09-25
  • 2020-05-04
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多