【问题标题】:Postman | API Chaining邮递员 | API 链接
【发布时间】:2017-02-25 20:40:51
【问题描述】:

我必须自动化这些-

  1. 获取美国员工名单:

    获取 /emps/usa

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

    获取 /emps/empid

第一个 API 返回如下数据:

[
  {
    "id": "1",
    "firstName": "Tom",
    "lastName": "Cruise"
  },
  {
    "id": "2",
    "firstName": "Maria",
    "lastName": "Sharapova"
  },
  {
    "id": "3",
    "firstName": "James",
    "lastName": "Bond"
  }
]

现在,对于每个员工,我需要调用第二个 API 以获取每个 id 的详细信息。

问题:我使用上述 API 创建了一个集合。 在第一次 API 调用之后,在 Postman 的 Tests 部分中,我正在阅读 循环中的响应值。 我的问题是:如何读取和保存每个员工id 的数据,然后 多次调用集合中的第二个 API 我收到了一名员工 id? 有没有办法从 Postman 的 Tests 部分调用 API? 或任何其他可行的想法?

【问题讨论】:

    标签: javascript arrays json postman


    【解决方案1】:

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

    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 本身都不包含关于 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,请执行以下操作:

    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 响应正文中,单击可视化

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

    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(() =&gt; {}, 43210);clearTimeout(lock);。 – 他们唯一的目的是充当a workaround for a known bug

    【讨论】:

      【解决方案2】:

      您是否尝试过使用邮递员控制工作流程? Cooper's meal plan 是一个很好的例子。 关键是:

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

      【讨论】:

        【解决方案3】:

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

        有效的解决方案(当您获得不同的 ID 以响应第一个请求时)将使用 newman 用于 Postman 的命令行收集运行程序。
        您需要在 postman app

        中创建两个单独的集合
        1. 获取 ID:将有 GET /emps/usa 请求

        从“GET /emps/usa”获取所有 id 并将其存储在环境变量中作为“,”分隔字符串,
        为此,您可以解析 JSON 响应
        创建将附加的空字符串变量根据您在响应中获得的数组大小,迭代中的每个 Id 字符串
        然后将看起来像“1,2,3”的结果字符串设置为环境变量

        postman.setEnvironmentVariable("allIds",result);
        

        一旦您在环境变量中获得预期的字符串,您就完成了 postman 步骤 1 :)
        现在是时候导出集合并从命令行工具运行此集合
        postman 导出的集合和环境是 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 文件
        csv 格式如下:
        身份证
        1
        2
        3
        一旦你在 csv 中得到这个东西,你就可以进入第 2 步。

        2。获取每个用户详细信息:GET /emps/empid 请求
        在邮递员应用程序中使用获取详细信息请求创建一个集合
        在预请求脚本中,您需要将值从文件设置为环境变量
        您的 pre req 脚本将如下所示:
        postman.setEnvironmentVariable('usrId',data['Id']);//refer 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
        

        【讨论】:

          猜你喜欢
          • 2017-09-06
          • 2020-01-24
          • 2018-02-09
          • 2017-06-17
          • 2015-11-11
          • 2019-05-14
          • 1970-01-01
          • 2019-12-12
          • 2020-07-23
          相关资源
          最近更新 更多