【问题标题】:How to get JSON response after ajax method POSTajax方法POST后如何获取JSON响应
【发布时间】: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()

【问题讨论】:

    标签: java jquery json ajax rest


    【解决方案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"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 2021-08-09
      相关资源
      最近更新 更多