Postman 脚本中使用jsonpath提取数据

这篇具有很好参考价值的文章主要介绍了Postman 脚本中使用jsonpath提取数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、背景

jsonpath 在处理 json 格式的数据方面是无敌的存在,前边我也篇关于 jsonpath 介绍的文章 Json 数据提取神器 jsonpath ,今天介绍 jsonpath 在 Postman 脚本中的应用

二、准备JSONPath脚本

Postman 的脚本是 JavaScript 语言,因此需要准备JS版本的JSONPath

1. JSONPath 源码

JSONPath Github官网

说明:

  • Github官网提供的JS语言的 JSONPath 版本 >= v0.12.0
  • npm 官网提供的 package 如下:
    JSONPath npm package(v0.8.0~v0.11.2)
    jsonpath-plus npm package(>= v0.12.0)

npm安装指定版本的JSONPath
npm i JSONPath@0.8.0

如果没有nodejs环境,访问下列地址下载源码到本地
js版本的 jsonpath package下载 (v0.8.0)

源码在JSONPath包的 lib/jsonpath.jsPostman 脚本中使用jsonpath提取数据

jsonpath.js源码:

/* JSONPath 0.8.0 - XPath for JSON
 *
 * Copyright (c) 2007 Stefan Goessner (goessner.net)
 * Licensed under the MIT (MIT-LICENSE.txt) licence.
 */
function jsonPath(obj, expr, arg) {
   var P = {
      resultType: arg && arg.resultType || "VALUE",
      result: [],
      normalize: function(expr) {
         var subx = [];
         return expr.replace(/[\['](\??\(.*?\))[\]']/g, function($0,$1){return "[#"+(subx.push($1)-1)+"]";})
                    .replace(/'?\.'?|\['?/g, ";")
                    .replace(/;;;|;;/g, ";..;")
                    .replace(/;$|'?\]|'$/g, "")
                    .replace(/#([0-9]+)/g, function($0,$1){return subx[$1];});
      },
      asPath: function(path) {
         var x = path.split(";"), p = "$";
         for (var i=1,n=x.length; i<n; i++)
            p += /^[0-9*]+$/.test(x[i]) ? ("["+x[i]+"]") : ("['"+x[i]+"']");
         return p;
      },
      store: function(p, v) {
         if (p) P.result[P.result.length] = P.resultType == "PATH" ? P.asPath(p) : v;
         return !!p;
      },
      trace: function(expr, val, path) {
         if (expr) {
            var x = expr.split(";"), loc = x.shift();
            x = x.join(";");
            if (val && val.hasOwnProperty(loc))
               P.trace(x, val[loc], path + ";" + loc);
            else if (loc === "*")
               P.walk(loc, x, val, path, function(m,l,x,v,p) { P.trace(m+";"+x,v,p); });
            else if (loc === "..") {
               P.trace(x, val, path);
               P.walk(loc, x, val, path, function(m,l,x,v,p) { typeof v[m] === "object" && P.trace("..;"+x,v[m],p+";"+m); });
            }
            else if (/,/.test(loc)) { // [name1,name2,...]
               for (var s=loc.split(/'?,'?/),i=0,n=s.length; i<n; i++)
                  P.trace(s[i]+";"+x, val, path);
            }
            else if (/^\(.*?\)$/.test(loc)) // [(expr)]
               P.trace(P.eval(loc, val, path.substr(path.lastIndexOf(";")+1))+";"+x, val, path);
            else if (/^\?\(.*?\)$/.test(loc)) // [?(expr)]
               P.walk(loc, x, val, path, function(m,l,x,v,p) { if (P.eval(l.replace(/^\?\((.*?)\)$/,"$1"),v[m],m)) P.trace(m+";"+x,v,p); });
            else if (/^(-?[0-9]*):(-?[0-9]*):?([0-9]*)$/.test(loc)) // [start:end:step]  phyton slice syntax
               P.slice(loc, x, val, path);
         }
         else
            P.store(path, val);
      },
      walk: function(loc, expr, val, path, f) {
         if (val instanceof Array) {
            for (var i=0,n=val.length; i<n; i++)
               if (i in val)
                  f(i,loc,expr,val,path);
         }
         else if (typeof val === "object") {
            for (var m in val)
               if (val.hasOwnProperty(m))
                  f(m,loc,expr,val,path);
         }
      },
      slice: function(loc, expr, val, path) {
         if (val instanceof Array) {
            var len=val.length, start=0, end=len, step=1;
            loc.replace(/^(-?[0-9]*):(-?[0-9]*):?(-?[0-9]*)$/g, function($0,$1,$2,$3){start=parseInt($1||start);end=parseInt($2||end);step=parseInt($3||step);});
            start = (start < 0) ? Math.max(0,start+len) : Math.min(len,start);
            end   = (end < 0)   ? Math.max(0,end+len)   : Math.min(len,end);
            for (var i=start; i<end; i+=step)
               P.trace(i+";"+expr, val, path);
         }
      },
      eval: function(x, _v, _vname) {
         try { return $ && _v && eval(x.replace(/@/g, "_v")); }
         catch(e) { throw new SyntaxError("jsonPath: " + e.message + ": " + x.replace(/@/g, "_v").replace(/\^/g, "_a")); }
      }
   };

   var $ = obj;
   if (expr && obj && (P.resultType == "VALUE" || P.resultType == "PATH")) {
      P.trace(P.normalize(expr).replace(/^\$;/,""), obj, "$");
      return P.result.length ? P.result : false;
   }
}

三、Postman脚本拓展知识

1. 脚本的作用域

在 Postman 中有6处可以写脚本的地方,分别是:Collection 的 Pre-request Script和Tests,Folder 的 Pre-request Script和Tests,Request 的 Pre-request Script和Tests
它们各自的作用域如下:

  1. Collection中的脚本,仅作用于当前集合(包括集合下的Folder)里的所有request,一般是项目维度的通用脚本放在这里;
  2. Folder中的脚本,仅作用于当前文件夹下的所有request,一般是功能模块维度的通用脚本放在这里;
  3. Request中的脚本,仅作用于当前request

注意:上述6处脚本执行时都是各自独立的

  • 如在Collection的Pre-request Script中定义变量和方法,在其他处的脚本内是不可以直接使用的;
  • 可以通过postman内置变量传递变量或方法,如:在Collection的Pre-request Script中设置集合变量 pm.collectionVariables.set(“key”,“value”),在后边其他脚本处可通过 pm.collectionVariables.get(“key”) 获取并使用

2. 脚本执行顺序

脚本的执行顺序:
Collection Pre-request Script > Folder Pre-request Script > Request Pre-request Script > Collection Tests > Folder Tests > Request Tests
Postman 脚本中使用jsonpath提取数据

3. eval() 函数介绍

使用eval()函数执行字符串类型的代码
JavaScript中的eval()函数

  • eval(string)函数计算 JavaScript 字符串,并把它作为脚本代码来执行;
  • 如果参数是一个表达式,eval()函数将执行表达式。如果参数是Javascript语句,eval()将字符串转化为 js 代码并执行;
  • 无法解释执行const声明的常量或函数代码,var声明的可以执行;

Postman 脚本中使用jsonpath提取数据

4. Postman内置变量存放代码块

在使用Postman进行接口测试时对于一些通用的脚本代码块,如果直接在脚本代码里使用,由于脚本作用域及执行顺序的关系,会使脚本冗余难以阅读及维护。
如何将通用代码块封装成通用的方法,然后在需要的时候直接调用呢?
其实方法比较简单,就是利用Postman内置变量来存放代码块字符串,然后使用eval()函数解析并执行代码。接下来举个栗子!

(1)定义变量存放代码块
在集合的Pre-request Script定义获取格式化日期的函数 dateFormat 下图中的 dateFormat 代码片段可到这里获取:https://www.cnblogs.com/edda/p/14588184.html
Postman 脚本中使用jsonpath提取数据

说明:
Postman中有多种变量类型

  • 按作用域划分:Global变量、Environment变量、Collection变量、数据变量、本地变量
  • Global变量:作用于当前Workspace下的所有Collections,且在所有环境下生效;
  • Environment变量:作用于当前Workspace下的所有Collections,但仅在当前环境生效;
  • Collection变量:作用于当前Collection,且在所有环境下生效;
  • 数据变量:仅作用于当前运行的Collection或Folder(取值与迭代次数有关)
  • 本地变量:作用范围与设置的位置有关,如在集合脚本中则作用于集合下的所有Folder及Request

不同变量的权重

  • 全局变量 < 集合变量 < 自定义环境变量 < 数据变量 < 本地变量
  • 在请求构造器中通过{{变量名}}取值时,变量名相同时,优先取权重高的变量

(2)使用eval()函数执行代码
先通过 Postman 内置变量获取到 代码块字符串,然后通过eval()函数解释为可执行的代码,示例如下:
Postman 脚本中使用jsonpath提取数据

四、Postman中使用JSONPath

在 Postman 脚本扩展知识 章节已经介绍过如何封装公共方法,这里直接上图。

说明:

  • jsonpath 代码可以存到Global变量中,这样在所有集合及所有环境下都可调用

1. JSONPath代码存放到Global变量

存放到变量里的代码块,建议压缩一下 js在线压缩工具

Postman 脚本中使用jsonpath提取数据

2. 使用JSONPath代码

jsonpath语法规则可以参考:https://goessner.net/articles/JsonPath/

Postman 脚本中使用jsonpath提取数据

jsonpath语法在线测试工具推荐:http://jsonpath.com/
Postman 脚本中使用jsonpath提取数据

五、最后

荐一篇文章:Use Node packages not bundled into Postman’s sandbox

说明:
这篇文章也提供了在Postman脚本中使用外部脚本的方法,大致思路是:

  1. 启动一个Nodejs服务,提供一个接口获取指定的 packages
  2. 在Postman脚本使用 pm.sendRequest 方法调用这个接口,获取js文件内容
  3. 将获取到的js代码存放到Postman的Globals变量中(下次再访问时就不用从接口获取了)
  4. 然后使用eval()函数执行代码

思路可借鉴,但是我不太推荐这种方式,原因是nodejs环境里并不是所有packages通过这个接口返回的代码,都能正常在Postman里工作,甚至请求某些package时接口还报错文章来源地址https://www.toymoban.com/news/detail-498635.html

到了这里,关于Postman 脚本中使用jsonpath提取数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Postman进阶篇(十二)-在脚本中使用pm对象访问接口响应数据(pm.response.*)

    在之前的文章中介绍过postman中的两个脚本——pre-request script或test script,在这两个脚本中都有使用到pm对象。(pre-request script详细介绍、Test script详细介绍) pm对象是在postman的脚本中非常重要,也是十分常用的方法。 本篇主要介绍pm对象的使用方法操作接口返回结果。 pm对象

    2023年04月08日
    浏览(85)
  • Postman提取响应数据

    某响应体信息内容 {\\\"status\\\":1,\\\"msg\\\":\\\"u767bu9646u6210u529f\\\",\\\"result\\\":{\\\"user_id\\\":139,\\\"email\\\":\\\"\\\",\\\"password\\\":\\\"519475228fe35ad067744465c42a19b2\\\",\\\"paypwd\\\":null,\\\"sex\\\":1,\\\"birthday\\\":978192000} 某响应头信息 Content-Type →text/html; charset=UTF-8 Transfer-Encoding →chunked Connection →keep-alive X-Powered-By →PHP/5.6.20 Set-Cookie →is_mo

    2024年02月13日
    浏览(38)
  • 【Postman】以命令行形式执行Postman脚本(使用newman)

    目录 以命令行形式执行Postman脚本(使用Newman) 一、背景 二、Newman的安装 1、Node.js 2、Newman 三、脚本准备 四、Newman的执行 1、run 2、变量的使用 3、参数化文件 4、指定folder 五、生成报告 1、生成简洁版html报告 2、生成加强版html测试报告和Json测试报告 ​Postman的操作离不开客

    2024年02月08日
    浏览(52)
  • 傻瓜式提取网页数据的油猴脚本(JavaScript 代码)

    目录 目录 一、脚本适用范围 二、将脚本配置到浏览器 三、脚本用法 四、脚本原理 五、脚本代码 脚本适用范围: 一次性提取任意网站的布局类似的数据,例如 淘宝的商品价格、微博的热搜标题、必应搜索的图片链接 脚本不适用范围: 页面布局不相似的数据。如下图圈出

    2024年01月22日
    浏览(41)
  • 关于PostMan中Tests脚本的使用

    不得不说PostMan真的是一个强大的接口测试工具,深得人心。 小编也在闲暇之余整理了一些有关于PostMan中的Tests脚本的示例,希望能帮助到热爱学习热爱工作的各位。 状态码验证: 响应时间验证: JSON 响应体验证: 字符串匹配验证: 数组长度验证 数据类型验证: 头部信息

    2024年01月23日
    浏览(39)
  • postman 文档、导出json脚本 导出响应数据 response ,showdoc导入postman json脚本 导出为文档word或markdown

    保存、补全尽可能多的数据、描述 保存响应数据 Response :(如果导出接口数据,会同步导出响应数据) 请求接口后,点击下方 Save as Example  可以保存响应数据到本地(会在左侧接口下新增一个e.g. 文件用来保存响应数据) 完善文档相关信息 :接口名、参数描述、自定义文

    2024年02月11日
    浏览(45)
  • postman使用教程-设置断言(tests脚本编写)

    一个完整的接口测试,包括:请求获取响应正文断言。所谓断言,就是结果和预期对比,如果一致,则用例通过,如果不一致,断言失败,用例执行失败。 当一个接口发送请求有返回结果后,如何知道返回的结果符合预期?可以在 postman 里面的 Tests 写脚本断言符合结果符合预

    2024年02月01日
    浏览(43)
  • 开发工具-网络测试工具 POSTMAN 的脚本使用

    POSTMAN 是网络编程中最常用的接口测试工具之一,能够使用脚本进行连续的自动测试。这里是以本地应用版为基础环境。 参考资料: Postman接口自动化测试 postman 可以在发送请求前使用脚本进行预处理,收到响应后使用脚本进行测试。 脚本的一些测试过程可以使用类似浏览器

    2024年02月13日
    浏览(50)
  • 使用脚本,直接修改注册表的值---设置win10背景色(保护色)

    目录 ■修改注册表(手动) ■修改注册表(脚本化) ・修改 ・恢复 ■其他(注册表图片) === 前言,媳妇上班,不会修改win10系统背景色(她想弄成保护色),提供个脚本,一键修改。 └window ⇒207 232 204 └Window ⇒caeace ・修改 新建一个xxx.reg文件,把下面内容复制进去 ・恢

    2024年02月12日
    浏览(48)
  • 在Postman的脚本中使用pm对象获取接口的请求参数

    query params页面 在tests中写脚本做后置处理:(此处以设置不同类型用户的全局变量为例) 执行后的响应信息: 执行后可在 console 中可见获取到的print type: 执行后可在 environment quick look 中可见变量信息: 使用双花括号进行引用: {{deliverToken}} 执行后的效果: 其中tests中的关

    2024年02月09日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包