【问题标题】:Postman rounding off BigInt邮递员四舍五入 BigInt
【发布时间】:2020-12-12 10:03:44
【问题描述】:

我正在尝试在 Postman 中设置一个较大的 int 值作为环境变量。

但 Postman 正在完善它。

有什么办法可以解决吗?

测试:

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 响应:

Response: { 
    "Offerings": [ 
        { 
            "Amount": 123,
            "CurrencyCode": "CAD",
            "DisplayName": "Samsung Galaxy S9+",
            "Id": 1910256760591000500,
            "Language": "en-CA",
            "LineOfBusinesses": [ 10048 ],
            "MarketingViews": [],
            "Name": "Samsung Galaxy S9+",
            "OfferType": 1,
        }
    ]
} 

【问题讨论】:

  • 什么意思?请把大整数值和“四舍五入”值也放在这里?
  • 将其作为字符串存储在环境中?
  • Large Int Value is : 1910256760591000500 Round off value is : 1910256760591000600 API 响应中根本没有四舍五入值。
  • 我尝试使用 toString() 但不起作用。
  • 你能把你的代码贴在这里吗?

标签: postman


【解决方案1】:

问题

是的。所以它不是邮递员,它是基本的 Javascript。 javascript 中的数字是双精度浮点数。基本上在 Javascript 中,最大的原始数字是 56 位,或者他们称之为 MAX_SAFE_INTEGER - 即 9,007,199,254,740,991。大多数语言都是 64 位 (9,223,372,036,854,775,807)。 postman 中发生的情况如下:

  • 您的数字需要超过 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 中包含它并不容易。具有讽刺意味的是,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)
    })();

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题。通过在解析之前为大数字添加引号作为响应来解决它。然后,您可以使用 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); 
           } 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-12
      • 2012-08-04
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      相关资源
      最近更新 更多