我必须自动化这些 -
获取美国所有员工名单
GET / emps / usa
获取每个用户详细信息
GET / emps / empid
第一个API返回如下数据:
[
{
"id": "1",
"firstName": "Tom",
"lastName": "Cruise"
},
{
"id": "2",
"firstName": "Maria",
"lastName": "Sharapova"
},
{
"id": "3",
"firstName": "James",
"lastName": "Bond"
}
]
现在,对于每个员工,需要通过获取ID来调用第二个API以获取详细信息。
问题:我创建了一个包含上述API的集合。在第一次API调用之后,在postman“test”部分中,我正在循环中读取响应的值。我的问题是如何读取和保存每个员工ID的数据,然后在我收到员工ID的时候多次调用集合中的第二个API。有没有办法从postman测试部分调用API?还是其他任何有用的想法?
希望我的问题很清楚。
答案 0 :(得分:2)
您是否尝试在收集运行器中传递来自文件(csv或json)的数据 如果您拥有文件中需要详细信息的所有ID,则此解决方案将起作用。然后相应地传递迭代次数。
高效的解决方案(当你第一次请求得到不同的id时)将使用Postman的 newman 命令行集合运行器。
您需要在邮递员应用
从“GET / emps / usa”获取所有id并将其作为“,”分隔字符串存储在环境变量中,为此,您可以解析您的JSON响应
创建空字符串变量根据你在响应中得到的数组的大小,在迭代中追加每个Id字符串。然后将结果字符串设置为环境变量<1,2>
postman.setEnvironmentVariable("allIds",result);
一旦你在环境变量中获得了预期的字符串,就完成了postman step1 :)。现在它的时间导出集合并从commanline工具运行此集合
从 postman 导出的集合和环境strong>是json格式的,假设 getData.json 是你的集合文件而 env.json 是你的环境文件
从cmd提示符或shell执行以下内容:
newman run getData.json -e env.json --export-environment expEnv.json
执行此操作时,您将获得expEnv.json,它将在执行期间生成id数据
现在可怕的部分来了(进程expEnv.json)
这里你需要用你喜欢的编程语言编写一个程序,它将采用这个expEnv.json进程/解析它并创建 csv 文件
标识
1
2
3
一旦你在csv中得到这个东西,你可以转到第2步。
2。获取每个用户详细信息: GET / emps / empid 请求
在邮递员应用中创建一个包含获取详细信息请求的集合在“预请求脚本”中,您需要将值从文件设置为环境变量
您的pre req脚本如下所示:
postman.setEnvironmentVariable('usrId',data['Id']);
//参考answer for details
现在通过在环境变量
中添加url中的usrId来更改URL
url看起来像 GET / emps / {{usrId}} 而不是GET / emps / empid
然后导出此集合并从newman运行它
让我们说getDetails.json是邮递员的导出集合你可以在这里使用相同的env.json
newman run getDetails.json -e env.json -d yourGeneratedCSVFile.csv
答案 1 :(得分:1)
您是否尝试使用邮递员控制工作流程? 你有Cooper's meal plan的好例子。 关键是:
答案 2 :(得分:0)
邮递员中没有“ API Chaining(tm)”之类的东西。
API链接(tm)是使用一个请求/响应将API调用链接在一起的过程。由于邮递员是客户端,因此每次都必须使用单独的请求/响应。
此过程必须在后端执行。
有关更多信息,请参见Beapi-API框架https://github.com/orubel/Beapi-API-Framework
答案 3 :(得分:0)
对于这个问题,我有一个可行的解决方案。
我的两个 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 本身都不包含关于两者
名称和图片链接。
显然,如果可以将两个API中的数据结合起来,问题就解决了 以这样一种方式——对于每个标识符——两者名称和 提供图片链接。像这样:
[
{
"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 中可视化数据:
我向
/emps/usa
API 作为
Postman 中的正常 GET 请求:
GET http://henke.atwebpages.com/postman/chaining/emps/usa
我可能可以向
/emps/empid
API
作为一个普通的邮递员请求 - 然后将两者结合起来
通过 Postman's Collection Runner 请求。
但是我向
/emps/empid
API
在预请求脚本中,如下所示:
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
});
在 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 Response Body 中,点击 Visualize。
完成! – 如果一切正常,您现在应该看到输出为 在上图中,以汤姆克鲁斯的名字和形象开头。
问题 如何读取和保存每个员工 ID 的数据,然后调用第二个 API 在集合中我收到了多少次员工 ID?
回答
我只调用这两个 API 一次,然后对数据做任何需要的事情
已取回。
我得到两个 JavaScript 数组,一个来自两个 API 中的每一个。
问题的本质归结为连接两个 JavaScript 数组
有一个共同的唯一标识符。
问题 有没有办法从 Postman 的测试部分调用 API?
回答 是的! – 在上述解决方案中,我之前提出了必要的 API 请求 测试部分开始。 然后我将 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 可复制此仅限测试版本:
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。