当前位置: 首页 > 知识库问答 >
问题:

如何从Axios POST请求返回18个字符的字符串响应

韦望
2023-03-14

我试图发出一个POST(添加)请求,返回添加项的ID。ID是一个18个字符的字符串。只要字符串不超过16个字符,一切都正常。当长度为18个字符时,最后两个字符总是损坏的,因为它们默认为零。

我使用Vuejs作为前端,使用SpringBoot作为后端。我知道javascript在很长一段时间内限制了53位的精度,这就是为什么我使用字符串作为这个ID的类型。如果我试图返回一个18位的数字,而不是一个18个字符的字符串,我希望会发生这种情况。虽然我返回了一个类型字符串,但Axios会自动将其转换为LONG,从而导致其损坏。我如何告诉Axios不要这样做?#标题##谢谢。

==========后端restcontrollerendpoint=============

@PostMapping("/persons")
public ResponseEntity<String> addPerson(@Valid @RequestBody Person person) {
    String newPersonId = personService.addPerson(person);
    return new ResponseEntity<>(newPersonId, HttpStatus.OK);
}

===================前端Axios POST呼叫===================

axios
    .post("http://localhost:xxxx/persons", newPerson)
    .then(response => {
      console.log("Response from post is: " + response.data);
      console.log(response);
      newPerson.id = response.data;
    })
    .catch(error => console.log(error));

=============控制台输出:=============

下面一行是控制台。从我的前端Post通话记录打印声明。这表明我收到了ID,最后两个数字为零。

回复是:622056030329638900

注意这个反应。数据(以下第3行)以900结尾,没有引号。如果你往下读,回答。要求答复(第10行)

  1. {data:622056030329638900,state: 200,statusText:"",标头:{...},配置:{...},...}
  2. 配置:{url:"http://localhost: xxxx/人",方法:"post",数据:"{"firstName":"daffy","middleName":"woddle","lastName":"Duck","home Email":"daffy@gmail.com"}",头:{...},变换请求:数组(1),...}
  3. 数据:622056030329638900
  4. 标头:{content ent-long:"18", content ent-type:"Application/json; charset=UTF-8"}
  5. 请求:XMLHttpRequest
  6. onabort()
  7. onError()
  8. onload: null
  9. onloadend: null
  10. onloadstart: null
  11. null
  12. onreadystatechange: HandleLoad()
  13. ontimeout: handleTimeout()
  14. 准备状态:4
  15. 回应:622056030329638912
  16. 回应文本:622056030329638912
  17. 响应类型:"
  18. 回应URL:"http://localhost: xxxx/人"
  19. 响应XML: null
  20. 状态:200
  21. 状态文本:"
  22. 超时:0

预期结果:发送的所有18个字符与接收的字符匹配。实际结果:前16个字符匹配,后两个为零。

共有3个答案

归明诚
2023-03-14

尝试在后端使用object返回:

{value: "622056030329638900"}

这对我有用!

席兴平
2023-03-14

这个数字(6220560329638912)对于JavaScript来说太大了。看看Number。最大安全整数,值为9007199254740991。任何大于“最大安全整数”的值都不能在浏览器中用作数字。

如果可以的话,把它当作一根绳子。如果必须使用response,请让API返回字符串值。数据。否则,使用responseText就可以了。

MAX_SAFE_INTEGER常量的值为9007199254740991 (9,007,199,254,740,991或~9000万亿)。这个数字背后的原因是JavaScript使用IEEE 754中规定的双精度浮点格式数字,并且只能安全地表示-(2^53 - 1)和2^53-1之间的数字。

这里的安全指的是精确表示整数并正确比较它们的能力。例如,Number.MAX_SAFE_INTEGER1===Number.MAX_SAFE_INTEGER2将计算为true,这在数学上是不正确的。有关详细信息,请参见Number.isSafeintger()。

下面是一个演示:

js prettyprint-override">console.log(Number.MAX_SAFE_INTEGER);
console.log(622056030329638922);
澹台衡
2023-03-14

问题最终归结为这样一个事实,即像“12334”这样的字符串不是有效的JSON字符串(而是有效的JSON数字)。参见这个问题

<script>
    // 1233
    alert(JSON.parse("1234")); // treated as a number

    // SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
    alert(JSON.parse("ABC"));
</script>

Axios默认情况下以这种方式转换响应(它解析json):

  transformResponse: [function transformResponse(data) {
    /*eslint no-param-reassign:0*/
    if (typeof data === 'string') {
      try {
        data = JSON.parse(data);
      } catch (e) { /* Ignore */ }
    }
    return data;
  }],

因此,如果你有以下选择:

第一:返回一个有效的Json字符串,如下所示:\"622056030329638912\"(服务器端的JSON ENCODE)

    alert(JSON.parse("\"622056030329638912\""));

二:禁用axios上的转换:

    axios
        .post("http://localhost:xxxx/persons", newPerson, {
            transformResponse: function(response) {
                // do not transform response at all... 
                return response;
            }
         })
        .then(response => {
            console.log("Response from post is: " + response.data);
            console.log(response);
            newPerson.id = response.data;
        })
        .catch(error => console.log(error));
 类似资料:
  • 问题内容: 好的,这就是我的for子手游戏代码,我唯一要做的就是让我的程序将其中一个单词随机化,这应该在方法中成功完成。但是我唯一的问题是让String变量 “ word” 返回到主类(在主类中的所有 “ word” 变量下面都有错误)。 如果我可以通过这种方法获得另一种帮助,或者从列表中产生随机单词的另一种方法,那将是惊人的。 问题答案: 在Java中,参数是通过值而不是引用传递的。因此,您不能

  • 原文: http://exploringjs.com/impatient-js/ch_strings.html 字符串是 JavaScript 中的原始值和不可变的。也就是说,与字符串相关的操作总是会生成新的字符串,并且永远不会更改 18.1。普通字符串字面值 纯字符串字面值由单引号或双引号分隔: const str1 = 'abc'; const str2 = "abc"; assert.e

  • 通过使用下面的代码,我可以找出我所在的数据中心,它工作正常。。 但它可能无法找到任何数据中心,因此目前我正在返回。 是否有任何直接的方式或单行命令,我可以在中随机返回或或而不是返回? 我知道一种方法是列出字符串,然后随机选择0到2(包括0到2)之间的任何整数,然后找到字符串。但它的代码太多了,事实上,它不仅仅是想看看有没有其他方法可以做到这一点? 我可以在枚举中直接使用任何简单而直接的方法吗?

  • GETRANGE key start end 返回key 中字符串值的子字符串,字符串的截取范围由start 和end 两个偏移量决定(包括start 和end 在内)。可以使用负值,字符串右面下标是从-1开始的。 注意返回值处理: 1: start>=length, 则返回空字符串 2: stop>=length,则截取至字符结尾 3: 如果start 所处位置在stop右边, 返回空字符串

  • 我试图使用Apache和MySQL XAMPP数据库为我的论坛建立一个登录页面,但它多次返回回显字符串,我知道它会遍历数据库中的所有行,检查是否为真,它返回的是“无效的用户名或密码!”直到找到正确的登录信息,然后返回“welcome”(欢迎)。 它是如何做到的,它只返回一个不正确的和正确的字符串?。

  • 问题内容: 我需要实现一个调用Web服务并返回响应的函数。 我试过了 在调用 Web服务时,将成功调用。但是在接收到响应之前返回。因此,我正在获取重调谐器值“ initial_value”。函数 如何从响应中返回值? 问题答案: GWT不支持同步Ajax,因此您必须使用异步模式对应用程序进行编码。 GWT用于执行请求的低级对象是XMLHttpRequest(旧的IE版本除外),并且GWT总是在as