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

如何在android studio中通过带有密码的POST方法获取JSON数据

如何从JQuery响应正确获取数据

如何获取 jQuery.ajax 响应状态?

如何在html中使用ajax方法从节点服务器获取响应

如何使用 Django 从 POST 表单中获取 JSON 响应