邮递员四舍五入大整数

时间:2019-05-28 15:43:20

标签: postman

我试图在邮递员中设置一个较大的int值作为环境变量。但是邮递员正在四舍五入。有什么办法可以解决吗? 请让我知道。

测试:var response = JSON.parse(responseBody); for(var i = 0; i <= response.Offerings.length; i ++){if(response.Offerings [i] .DisplayName =='Samsung Galaxy S9 +'){console.log(response.Offerings [i] .Id ); }}

API响应:响应:{“报价”:[{“金额”:123,“ CurrencyCode”:“ CAD”,“ DisplayName”:“ Samsung Galaxy S9 +”,“ Id”: 1910256760591000500,“语言”:“ en-CA”,“ LineOfBusinesses”:[10048],“ MarketingViews”:[],“名称”:“ Samsung Galaxy S9 +”,“ OfferType”:1,

2 个答案:

答案 0 :(得分:0)

我刚刚遇到了同样的问题。通过在解析前以大号添加引号来解决该问题。然后,您可以使用其他they wrote

库获取变量并将其解析为BigInt
var responseBigIntsChangedToStrings = pm.response.text().replace(/([^"\w-])([-0-9.]{8,100})([^"\w-])/g, '$1\"$2\"$3');
var jsonResponse = [...responseBigIntsChangedToStrings.matchAll(/{.*}/g)];
var json = JSON.parse(jsonResponse);

您可以尝试以下方法:

var response = JSON.parse(responseBody.replace(/([^"\w-])([-0-9.]{8,100})([^"\w-])/g, '$1\"$2\"$3')); 
for(var i=0; i<=response.Offerings.length ; i++) 
{ 
       if(response.Offerings[i].DisplayName == 'Samsung Galaxy S9+') 
       {
           console.log(response.Offerings[i].Id); 
       } 
}

答案 1 :(得分:0)

问题

是的。因此,不是四舍五入的邮递员就是基本的Javascript。 javascript中的数字为双精度浮点数。基本上,在Javascript中,最大原语数是56位,或者称为MAX_SAFE_INTEGER-即9,007,199,254,740,991。大多数语言为64位(9,223,372,036,854,775,807)。 邮递员将发生以下情况:

  • 您输入的数字需要超过56位。
  • JavaScript希望为您提供帮助,并尽可能将其转换
  • JSON.parse(responseBody)不能转换任何大于56位的数字。因此,它会尽力而为,它可以使您看起来像一个四舍五入的数字。

小例子是这样的:

let x = 9223372036854775807
let y = BigInt(9223372036854775807)
let text = x.toString();
let z = parseInt(text, 10);
console.log(z) // 9223372036854776000

javascript中对此有解决方案。即有几个库,例如“ json-bigint”。但是,将其包含在Postman中并不容易。具有讽刺意味的是,邮递员已经使用了BigInteger,但是当您正在执行的代码是基本javascript时,它将无法使用。但这仍然是@Plurimus解决方案应该起作用的原因。

该做什么

每当需要Postman中的库时,都有使用requests加载库的方法。在这里,用户演示了如何加载主要存储在cloudflare上的库。和剧透-json-bigint-不在那里。这是一个npmjs库,只会增加添加难度。 您肯定会遇到的一个问题是Postman的预请求是异步的。这意味着您的库可能已加载,但是应该使用该库的代码已经执行。幸运的是,有人为此找到了hack

解决方案

在我的解决方案中,我想要使用的个人github上有一个library的链接。总是叉这样的东西。然后,我使用邮递员获取代码。并使用eval覆盖JSON对象。有一些初步代码显示加载库之前和之后的值。 该请求在名为main的方法中运行,该方法是一种添加到预请求中的异步方法,以确保该函数中的所有内容均同步运行。

    console.log('hello');
    var libraryLink = 'https://gist.githubusercontent.com/kentkost/f2699eb1dd41e2eb6203f0d0c77a987e/raw/bffae74aa3827ea195c10cf83bce4d78017bdf2d/postman-bigint.js'

    let dummyJson = '{ "value" : 9223372036854775807, "v2": 123 }'
    let obj = JSON.parse(dummyJson)
    console.log(obj.value);
    console.log(JSON.stringify(obj));

    const _dummy = setInterval(() => {}, 300000);

    function sendRequest(req) {
        return new Promise((resolve, reject) => {
            pm.sendRequest(req, (err, res) => {
                if (err) {
                    return reject(err);
                }

                return resolve(res);
            })
        });
    }

    (async function main() {
        let result1 = await sendRequest(libraryLink);
        eval(result1.text());
        
        let newObj = JSON.parse(dummyJson);
        console.log(newObj.value);
        pm.environment.set("someVar", newObj.value);
        console.log(JSON.stringify(newObj));
        console.log('bye');
        clearInterval(_dummy)
    })();

Result of prerequest