邮差| API链接

时间:2016-10-16 23:31:12

标签: json postman

我必须自动化这些 -

  1. 获取美国所有员工名单

    GET / emps / usa

  2. 获取每个用户详细信息

    GET / emps / empid

  3. 第一个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?还是其他任何有用的想法?

    希望我的问题很清楚。

4 个答案:

答案 0 :(得分:2)

您是否尝试在收集运行器中传递来自文件(csv或json)的数据 如果您拥有文件中需要详细信息的所有ID,则此解决方案将起作用。然后相应地传递迭代次数。

高效的解决方案(当你第一次请求得到不同的id时)将使用Postman的 newman 命令行集合运行器。
您需要在邮递员应用

中创建两个单独的集合
  1. 获取ID:将有 GET / emps / usa 请求
  2. 从“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的好例子。 关键是:

  1. 实现标准循环,但将索引保留在环境变量中。
  2. 做你需要的任何事情,检查持久性索引,并在需要时使用postman.setNextRequest(&#34;&lt; requestName&gt;&#34;)。

答案 2 :(得分:0)

邮递员中没有“ API Chaining(tm)”之类的东西。

API链接(tm)是使用一个请求/响应将API调用链接在一起的过程。由于邮递员是客户端,因此每次都必须使用单独的请求/响应。

此过程必须在后端执行。

有关更多信息,请参见Beapi-API框架https://github.com/orubel/Beapi-API-Framework

答案 3 :(得分:0)

对于这个问题,我有一个可行的解决方案。

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 链接以查看未缩写的版本。)

注意第一个端点中每个对象/人如何拥有唯一的 idname,仅此而已。 对于第一个端点中的每个对象,第二个 API 具有相同的 唯一标识符,以及描述和图像链接 / 肖像。 因此,这两个 API 本身都不包含关于两者 名称和图片链接。

2.结果

显然,如果可以将两个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 中可视化数据:

Visualized Result in Postman

3.方法论

我向 /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
});

4.如何在 Postman 中复制我的解决方案

在 Postman 中复制我的结果应该很简单。
假设您使用的是 the desktop version of Postman,请执行以下操作:

  1. 下载并保存
    http://henke.atwebpages.com/postman/chaining/emps/API-Chaining.pm_coll.json
    在硬盘上的合适位置。

  2. 在 Postman 中,Ctrl + O > 上传文件 > API-Chaining.pm_coll.json > 导入
    您现在应该会在 Postman 的收藏中看到 API Chaining

  3. 集合 > API Chaining > US-empl-request > 发送

  4. 在 Postman Response Body 中,点击 Visualize

  5. 完成! – 如果一切正常,您现在应该看到输出为 在上图中,以汤姆克鲁斯的名字和形象开头。

5.原发帖人的两个问题 + 一个额外的问题

问题 如何读取和保存每个员工 ID 的数据,然后调用第二个 API 在集合中我收到了多少次员工 ID?

回答 我只调用这两个 API 一次,然后对数据做任何需要的事情 已取回。
我得到两个 JavaScript 数组,一个来自两个 API 中的每一个。 问题的本质归结为连接两个 JavaScript 数组 有一个共同的唯一标识符。


问题 有没有办法从 Postman 的测试部分调用 API?

回答 是的! – 在上述解决方案中,我之前提出了必要的 API 请求 测试部分开始。 然后我将 Tests 部分用于从请求中获取数据 – 保存在两个环境变量中 - 最后操纵该数据以 达到最终目标。

但是您可以在测试全部做到这一点。请参阅下面的最后一部分。


问题 但是嘿,这不再是链接了! —— 没有第二请求使用来自第一请求的信息。 对吗?

回答 这是正确的! – 将哪个请求放入预请求并不重要 脚本,并作为普通请求运行。交换它们应该有效 一样好。重点是:问题的提出者想到了问题 需要链接请求。 (我在下一节中介绍了一个这样的解决方案。) 事实证明,链接请求不是解决问题的必要 问题。

6.在测试部分

完成全部

您实际上可以在测试脚本中完成所有事情

虽然链接请求并不是解决问题的必要条件, 这是测试部分中代码的解决方案,确实 应用第二个链接请求。
第二个请求不依赖于第一个请求的任何数据,但是 第二个回调需要来自两个请求的数据。
(主要请求只是一个从未使用过的虚拟请求——除了开始 运行测试脚本。)

两个请求都是在脚本中进行,然后组合,最后可视化: 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