REST / JSON - 响应中的字段是否被浏览器静默递增?

时间:2018-05-02 15:53:23

标签: javascript rest typescript

我正在构建一个JavaScript应用程序(React / etc。),它使用来自协同服务器的REST资源(用Spring Boot / REST / JPA编写)。

大多数情况下,我会拉动实体列表或单个实体 -

  • .../rest/tasks?page=0
  • .../rest/tasks/1234567

- 每个实体的样子:

{
  "id" : 20180501150819347,
  "requested" : "2018-05-01T19:08:19.353+0000",
  "cancelled" : null,
  "delayUntil" : null,
  "started" : "2018-05-01T19:08:30.140+0000",
  "ended" : "2018-05-01T19:08:31.610+0000",
  "status" : "complete",
  ...

问题是因为某种原因," id"我的实体上的字段正在递增!

例如:

1。我发出请求:/rest/tasks,以获取已提交任务的列表。

2。结果回复如下:

...
"tasks": [ {
  "id" : 20180501150819347,
  ...

这是正确的:我的数据库中存在该ID的任务实体。

3. 然后,JSON响应将作为以下内容提供给我的应用程序:

...
"tasks": [ {
  "id" : 20180501150819348,
  ...

4. 我绝对可以通过rest/tasks/...9347检索该实体 - 但是,如(2)和(3)所示,生成的JSON对象具有不正确的(递增的)ID。

奇怪的部分是:这似乎发生在浏览器级别。例如,当我在Chrome中检查网络请求/响应时,我看到原始响应包含正确的ID,而漂亮打印的响应包含不正确的(递增的)ID。我已经通过Chrome(66.0.3359.139)和Firefox(59.0.3)对此进行了验证。

但是,这是唯一表现出这种行为的实体类型。我已经测试了所有其他实体类型(同时包含intlong ID)。这种行为在多次重启(应用程序和浏览器)中都是一致的。

Chrome - response (raw)

Chrome - response (pretty-printed)

1 个答案:

答案 0 :(得分:0)

你有四舍五入的问题。号码20180501150819347大于Number.MAX_SAFE_INTEGER。 JavaScript(和TypeScript)将所有数字表示为浮点数,因此,不能正确表示大于该常数的数字。不幸的是,JavaScript没有纯整数类型或长整数。

您可以在此处查看此行为:



var num = 20180501150819347;

console.log(num);




如您所见,console.log打印下一个数字,与您相同。

当您处理ID时,我的建议是您将id属性的类型更改为string。它在服务器端无关紧要,但会阻止客户端出现问题:

...
"tasks": [ {
  "id" : "20180501150819347",
  ...
}, ...]