请求后执行的邮递员预请求脚本

Posted

技术标签:

【中文标题】请求后执行的邮递员预请求脚本【英文标题】:Postman pre-request script executing AFTER the request 【发布时间】:2015-10-26 04:01:52 【问题描述】:

我有一个对服务器的身份验证后调用,如下所示:

http://localhost/ServiceName/AuthenticateUser

这样发送的正文:


    "userCredentials":"securityToken"

我总是必须在 Postman 中执行两次此 Authenticate 调用,以正确填充我的全局 var 'securityToken' 并在其后用于下一次 Authenticate 调用,因此看起来预请求脚本实际上是在脚本之后运行的,或者是不是请求前脚本中设置的全局变量不适用于当前请求?

第一次运行时服务器返回登录错误,下次登录正常。

我做错了什么?

这是预请求脚本:

// Import the CryptoJS library with jQuery
$.when(
    $.getScript( "http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/md5.js" ),
    $.getScript( "http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js" ),

    $.Deferred(function( deferred )
        $( deferred.resolve );
    )
).done(function()

    //The scripts are all loaded
    var api = 

        connection: 

            aesIV: 'blabla',
            aesKey: 'secretNoTellingYou'
        
    

    var aesIV = CryptoJS.enc.Hex.parse(api.connection.aesIV);
    var aesKey = CryptoJS.enc.Utf8.parse(api.connection.aesKey);

    if (!CryptoJS || !CryptoJS.AES || !CryptoJS.MD5) 
        alert('CryptoJS AES and MD5 Library Must Be Loaded');
    

    var encrypt = function (text) 
        var encrypted = CryptoJS.AES.encrypt(text, aesKey,  iv: aesIV );
        return encrypted;
    ;

    var encryptedUserCode = encrypt(globals["userCode"]).toString();
    var md5Password = CryptoJS.MD5(globals["password"]).toString().toUpperCase();
    var encryptedPassword = encrypt(md5Password.toString());
    var token = SomeFunctionToCreateToken(encryptedUserCode , encryptedPassword);

    postman.setGlobalVariable('securityToken', token);    

);

【问题讨论】:

是否有可能在初次通话时出现错误。我有一个类似的问题,似乎预请求脚本没有运行,结果发现在服务器端我的服务没有正确激活。您是否尝试过像 Fiddler 这样的工具来检查您的初始请求的响应? @GartuanTezMaximus 不,跟踪服务器代码,调用确实是使用先前的参数值进行的,并且完成。 【参考方案1】:

实际上,一旦我用现在集成的库替换脚本导入,问题就消失了:

//The scripts are all loaded
    var api = 

        connection: 

            aesIV: 'blabla',
            aesKey: 'secretNoTellingYou'
        
    

    var aesIV = CryptoJS.enc.Hex.parse(api.connection.aesIV);
    var aesKey = CryptoJS.enc.Utf8.parse(api.connection.aesKey);

    if (!CryptoJS || !CryptoJS.AES || !CryptoJS.MD5) 
        alert('CryptoJS AES and MD5 Library Must Be Loaded');
    

    var encrypt = function (text) 
        var encrypted = CryptoJS.AES.encrypt(text, aesKey,  iv: aesIV );
        return encrypted;
    ;

    var encryptedUserCode = encrypt(globals["userCode"]).toString();
    var md5Password = CryptoJS.MD5(globals["password"]).toString().toUpperCase();
    var encryptedPassword = encrypt(md5Password.toString());
    var token = encryptedUserCode + "|" + encryptedPassword;

    postman.setGlobalVariable('securityToken', token);    

【讨论】:

这对我在 Postman 中设置测试帮助很大。类似这样的事情应该记录在 Postman 的网站上!谢谢! @Codeversed 很高兴这对其他人有所帮助!【参考方案2】:

我可以确认这种行为,由提琴手证明。无论预请求脚本的执行如何,都会触发请求。

显然这是由于 Postman 在预请求脚本中支持 ajax 调用。

https://github.com/postmanlabs/postman-app-support/issues/644

他们建议创建两个请求,一个初始 POST 用于创建令牌,然后将其与后续请求链接并设置环境变量以对这些请求进行签名。

【讨论】:

请告诉我们如何在请求中发出请求。

以上是关于请求后执行的邮递员预请求脚本的主要内容,如果未能解决你的问题,请参考以下文章

邮递员“评估预请求脚本时出错”,但预请求脚本为空

接口测试进阶接口脚本使用--apipost(预/后执行脚本)

邮递员 - 在预请求脚本中访问完整的请求正文(以计算哈希)

Postman预执行脚本和后执行脚本

邮递员在预请求脚本中获取随机用户名

如果响应正文中的 id 具有依赖性,如何使用预请求脚本在邮递员中设置 2 个集合变量?