【发布时间】:2020-01-15 10:29:22
【问题描述】:
我正在尝试发出返回添加项目 ID 的 POST(添加)请求。 ID 是一个 18 个字符的字符串。只要字符串不超过 16 个字符,一切正常。当长度为 18 个字符时,最后两个字符总是损坏,因为它们默认为零。
我使用 Vuejs 作为前端,使用 SpringBoot 作为后端。我知道一个 Long 的 53 位精度的 javascript 限制,这就是为什么我使用 String 作为我的这个 ID 的类型。如果我试图返回一个 18 位数字而不是 18 个字符的字符串,我希望会发生这种情况。看来,虽然我返回了一个类型 STRING,但 Axios 会自动将其转换为 LONG,这会导致它被损坏。我如何告诉 Axios 不要这样做? ## 标题##谢谢。
=========后端restcontroller端点=============
@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 调用的 console.log 打印语句。这表明我收到了 ID,最后两位数字为零。
帖子的回复是:622056030329638900
请注意,response.data(下面的第 3 行)以 900 结尾,并且没有被引号包围。如果您进一步阅读 - response.request.response(第 10 行和第 11 行)以 912 结尾,这是正确的响应。我想我知道它们为什么不匹配(Axios 将其转换为 Long 并且它被 53 位精度限制破坏)但我不明白为什么 Axios 首先将 String 转换为 Long。
- {data: 622056030329638900, status: 200, statusText: "", headers: {…}, config: {…}, …}
- 配置:{url:“http://localhost:xxxx/persons”,方法:“post”,数据:“{“firstName”:“daffy”,“middleName”:“woddle”,“lastName”:“duck”,“homeEmail” ":"daffy@gmail.com"}",标题:{...},transformRequest:Array(1),...}
- 数据:622056030329638900
- 标头:{content-length: "18", content-type: "application/json;charset=UTF-8"}
- 请求:XMLHttpRequest
- onabort:ƒ handleAbort()
- onerror: ƒ handleError()
- 加载:空
- onloadend: null
- onloadstart:空
- 进行中:空
- onreadystatechange: ƒ handleLoad()
- ontimeout: ƒ handleTimeout()
- 就绪状态:4
- 回复:“622056030329638912”
- 响应文本:“622056030329638912”
- 响应类型:“”
- 响应网址:“http://localhost:xxxx/persons”
- responseXML:空
- 状态:200
- 状态文本:“”
- 超时:0
预期结果:发送的所有 18 个字符都与接收的字符匹配。 实际结果:前16个字符匹配,后两个为零。
【问题讨论】:
-
为什么不使用 responseText?
-
您的 API 返回的数据是否正确?
-
content-type: "application/json;charset=UTF-8"。响应正文被解析为 JSON,因此如果没有引号,它将被转换为数字。另请参阅 axios 的responseType设置。 -
尝试使用Axios的“拦截器”
-
我将研究拦截器和 responseType - 首选是实现它,因此 response.data 与使用 responseText 相比是有效的
标签: javascript spring spring-boot vue.js axios