我对这个问题有一个可行的解决方案。
1。先决条件
我的两个API/端点如下。
{
"US-employees": [
{
"id": "Q37079",
"name": "Tom Cruise"
},
{
"id": "Q844",
"name": "James Bond"
},
{
"id": "Q11666",
"name": "Maria Sharapova"
}
]
}
{
"US-portraits": [
{
"id": "Q844",
"description": "Fictional British spy",
"image": "https://upload.wikimedia.org/ [...] _Bangalore_144323.jpg"
},
{
"id": "Q11666",
"description": "Russian tennis player",
"image": "https://upload.wikimedia.org/ [...] _%2843186339350%29.jpg"
},
{
"id": "Q37079",
"description": "American actor and producer",
"image": "https://upload.wikimedia.org/ [...] _Skidmore_2.jpg"
}
]
}
为了提高可读性,我截断了图片的链接。
(只需单击
/emps/empid
链接以查看未缩写的版本。)
在第一个端点中注意每个对象/人如何具有唯一性
id 和 name,仅此而已。
第二个 API 具有 - 对于第一个端点中的每个对象 - 相同
唯一标识符,以及描述和图像链接 /
肖像。
因此,这两个 API 本身都不包含关于 both 的信息
名称和图片链接。
2。结果
显然,如果两个API中的数据可以合并,问题就解决了
以这样一种方式组合在一起 – 对于每个标识符 – both 名称和
提供图片链接。像这样:
[
{
"id": "Q37079",
"name": "Tom Cruise",
"description": "American actor and producer",
"image": "https://upload.wikimedia.org/ [...] _Skidmore_2.jpg"
},
{
"id": "Q844",
"name": "James Bond",
"description": "Fictional British spy",
"image": "https://upload.wikimedia.org/ [...] _Bangalore_144323.jpg"
},
{
"id": "Q11666",
"name": "Maria Sharapova",
"description": "Russian tennis player",
"image": "https://upload.wikimedia.org/ [...] _%2843186339350%29.jpg"
}
]
剩下的就是在 Postman 中可视化数据:
3。方法
我向
/emps/usa API 作为
Postman 中的普通 GET 请求:
GET http://henke.atwebpages.com/postman/chaining/emps/usa
我可能已经向
/emps/empidAPI
作为一个普通的邮递员请求 - 然后将两者结合起来
通过 Postman 的 Collection Runner 请求。
但是我向
/emps/empidAPI
在 Pre-request 脚本中,如下所示:
const url = 'http://henke.atwebpages.com/postman/chaining/emps/empid';
pm.sendRequest(url, (err, response) => {
pm.environment.set('US_portraits',
JSON.stringify(response.json()['US-portraits']));
});
然后,在 Tests 部分,我将两个结果组合在一起,然后
最后将它们可视化:
const usEmployees = pm.response.json()['US-employees'];
const usPortraits = JSON.parse(pm.environment.get('US_portraits'));
usEmployees.map(x => Object.assign(x, usPortraits.find(y => y.id === x.id)));
const tblHeader = Object.keys(pm.response.json())[0];
const template = `
<table>
<tr><th>` + tblHeader + `</th></tr>
{{#each response}}
<tr><td>{{name}}<br><img src="{{image}}"></td></tr>
{{/each}}
</table>`;
pm.visualizer.set(template, {
response: usEmployees
});
4。如何在 Postman 中复制我的解决方案
在 Postman 中复制我的结果应该很简单。
假设您使用的是the desktop version of Postman,请执行以下操作:
-
下载并保存
http://henke.atwebpages.com/postman/chaining/emps/API-Chaining.pm_coll.json
放在硬盘上的合适位置。
-
在 Postman 中,Ctrl + O > 上传文件 >
API-Chaining.pm_coll.json > 导入。
您现在应该在 Postman 的收藏中看到 API Chaining。
-
收藏 > API Chaining > US-empl-request > 发送。
-
在 Postman 响应正文中,单击可视化。
-
完成! – 如果一切都按预期工作,您现在应该看到输出为
在上图中,以汤姆克鲁斯的名字和形象开头。
5。原发帖人的两个问题+一个额外的问题
问题
如何读取和保存每个员工 ID 的数据,然后调用第二个 API
在集合中我收到了员工 ID 的次数?
回答
我只调用这两个 API 一次,然后对数据执行任何需要的操作
已取回。
我得到 两个 JavaScript 数组,两个 API 各有一个。
问题的本质归结为连接两个 JavaScript 数组
有一个共同的唯一标识符。
问题
有没有办法从 Postman 的测试部分调用 API?
回答
是的! – 在上述解决方案中,我在之前发出了必要的 API 请求
测试部分开始了。
然后我将 Tests 部分用于从请求中获取数据——
保存在两个环境变量中——最后将这些数据操作到
达到最终目标。
但你可以在 Tests 中完成 all。请参阅下面的最后一节。
问题
但是,嘿,这不再是链接了! –
没有 second 请求使用来自 first 请求的信息。
对吧?
回答
这是正确的! – 将哪个请求放在 Pre-request 中并不重要
脚本,并作为 普通 请求运行。交换它们应该有效
一样好。重点是:提出问题的人想到了问题
作为发出链接请求的需要。
(我将在下一节中介绍一个这样的解决方案。)
事实证明,链接请求并不是必要来解决
问题。
6。 全部在 Tests 部分进行
您实际上可以在 Tests 脚本中按字面意思进行一切。
虽然链接请求并不是解决问题所必需的,
这是 Tests 部分中的代码 only 的解决方案,确实
应用第二个链接请求。
第二个请求不依赖于第一个请求的任何数据,但是
第二个回调需要来自两个请求的数据。
(主请求只是一个从未使用过的虚拟请求——除了 start
运行 Tests 脚本。)
两个请求都在脚本中提出,然后组合,最后可视化:
1
const lock = setTimeout(() => {}, 43210);
const urlO = 'http://henke.atwebpages.com/postman/chaining/emps/empid';
const urlI = 'http://henke.atwebpages.com/postman/chaining/emps/usa';
pm.sendRequest(urlO, (_, responseO) => {
const usPortraits = responseO.json()['US-portraits'];
pm.sendRequest(urlI, (_, responseI) => {
clearTimeout(lock); // Unlock the timeout.
const usEmployees = responseI.json()['US-employees'];
usEmployees.map(x => Object.assign(x,
usPortraits.find(y => y.id === x.id)));
const tblHeader = Object.keys(responseI.json())[0];
const template = `<table>
<tr><th>` + tblHeader + `</th></tr>
{{#each responseI}}
<tr><td>{{name}}<br><img src="{{image}}"></td></tr>
{{/each}}
</table>`;
pm.visualizer.set(template, { responseI: usEmployees });
});
});
Postman Collection 复制此 Tests-only 版本:
http://henke.atwebpages.com/postman/chaining/emps/API-Chain.sendReq.pm_coll.json。
参考文献
1 不要被台词弄糊涂
const lock = setTimeout(() => {}, 43210); 和 clearTimeout(lock);。 –
他们唯一的目的是充当a workaround for a known bug。