ajax方法POST后如何获取JSON响应
Posted
技术标签:
【中文标题】ajax方法POST后如何获取JSON响应【英文标题】:How to get JSON response after ajax method POST 【发布时间】:2020-10-28 04:44:03 【问题描述】:我向我的休息控制器发出一个发布请求,因此我想在数据不正确的情况下获取有关错误的信息。在@RestControllerAdvice
中生成错误信息。
这是我的建议课:
@RestControllerAdvice
public class RestControllerErrorHandler
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Map<String, Object> handleCustomerException(MethodArgumentNotValidException exception)
Map<String, Object> body = new LinkedHashMap<>();
body.put("timestamp", new Date());
body.put("exception", "MethodArgumentNotValidException");
List<String> errors = exception
.getBindingResult()
.getFieldErrors()
.stream()
.map(DefaultMessageSourceResolvable::getDefaultMessage)
.collect(Collectors.toList());
body.put("errors", errors);
return body;
这是我得到的错误的结果。
"timestamp": "2020-07-07T20:20:44.778+00:00",
"exception": "MethodArgumentNotValidException",
"errors": [
"Login length: 6 - min and 10 - max",
"Password length: 6 - min and 10 - max"
]
这就是我从 ajax 调用方法 POST 的方式:
$(document).ready(function ()
$("#sendForm").click(function ()
const login = $('input[name=login]').val();
const password = $('input[name=password]').val();
$.ajax(
type: "POST",
url: "/api/users",
contentType: 'application/json',
data: JSON.stringify("login": login, "password": password),
dataType: "json",
success: function (data)
alert('success: ' + data.id + " " + data.login + " " + data.password)
,
error: function (requestObject, error, errorThrown)
alert(error);//this field return "error" string
alert(errorThrown);//for some reason this is empty when I get an error
);
);
);
我如何阅读它以获得准确的错误信息?我想显示这个:"Login length: 6 - min and 10 - max", "Password length: 6 - min and 10 - max"
in alert()
。
【问题讨论】:
【参考方案1】:所以,你应该注意 - 响应是一个对象(类数组),它有一个名为 errors
的子键,它本身包含数据(非键控数组)。因此,您应该将 Ajax 成功部分更改为:
success: function (data)
var parsed_response = JSON.parse(data);
alert(parsed_response.errors[0]+ " " + parsed_response.errors[1]);
,
如您所见,通过解析响应,您可以访问对象的成员。
更新:
如果您想获得错误响应,则表示您为响应准备的“响应对象”(包含时间戳,异常,错误...成员),没关系,因为它不会返回那个(错误的)情况。因此,在这种情况下,正如您已经提到的,您将收到错误消息的alert
,并且根据该错误消息(即 404、410、...),它会告诉您后端发生了什么。在这种情况下,您不会得到任何响应,因为“错误”函数本身表示服务器没有返回可读(输出)的答案,您必须修复该错误(即 410、503 或其他错误,在谷歌中搜索它们)。
我可能还会建议在收到 ajax 请求时将调试文件保存为后端语言,这样您就会发现后端代码在哪一行中断。
即
save_to_file("a1");
your codes
save_to_file("a2");
your another codes
save_to_file("a3");
等等……
所以,一些后端代码有错误。
【讨论】:
当响应状态为 OK(200)success
块工作。在这种情况下,我得到了我想要以 JSON 格式保存的数据。但我正在寻找其他如何在响应为 BAD_REQUEST 或其他时获取错误消息,在这种情况下 error
块有效。
@IljaTarasovs 我已经更新了我的答案。这就是我从你解释的情况中所能理解的。祝你好运。【参考方案2】:
找到了解决办法:
error: function (requestObject, error, errorThrown)
const result = JSON.parse(requestObject.responseText);
alert('error: ' + result.errors[0]);//"Login length: 6 - min and 10 - max"
【讨论】:
以上是关于ajax方法POST后如何获取JSON响应的主要内容,如果未能解决你的问题,请参考以下文章
如何在 AJAX POST 请求后解析来自服务器的 JSON 响应?