jquery ajax參数加点号状态200进error

Posted wzjhoutai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jquery ajax參数加点号状态200进error相关的知识,希望对你有一定的参考价值。

今天开发中遇到一个非常恶心的问题:

用jquery中的ajax提交。发现假设參数中有点号的參数。后台正常返回200状态码的情况下也会走到error:function。

1. 參数data: "topicAbstractInfoVO.belongSubjectId="+subjectId

2. 參数data:“belongSubjectId="+subjectId,

请求正常返回,状态为200。

第一种情况,跳到了error处理块。另外一种情况跳到success处理块。

ajax请求代码例如以下:

$.ajax({
 url: "/topic/saveMarkDraft.action",
     dataType: "json",
 type: "POST",
     data: "topicAbstractInfoVO.belongSubjectId="+subjectId,
     async:true,
     success: function(msg){
     var a=2;
     var b=a;
     alert(b);
     alert(msg);
     },
     error:function(msg){
     var a=1;
     var b=a;
     if(msg.responseText=="saveMarkSuccess"){
     alert(b);
     }
     alert(msg);
     }
});

后台处理方法:

    public String addMarkDraft() {
        print("saveMarkSuccess");
        return "saveMarkSuccess";
    }

排查问题:

1. 之前有遇到过类似返回200时跳到error模块的情况。是由于dataType设置的为html,返回内容为json。类型不匹配也会导致这个问题。(今天的问题不是这个原因,排除)

2. 前面另一个类似的方法也是返回json,js是一样的配置。是没有问题的;经过对照代码发现一个不同点,就是print()方法

2.1 正确的方法是这样返回的

   public String addMarkDraft() {
        String te = JsonUtil.toJson("saveMarkSuccess");
        print(te);
        return "saveMarkSuccess";
    }

改动方法有两种:

1. 将ajax的dataType改为text

2. 将后台返回的字符串"saveMarkSuccess"用json转下

结论:

因为返回的内容不是json格式,是string格式。根本问题还是因为js的类型和返回的类型不一致。

总结:

1.  尽管对于一个字符串,用json序列化后还是一个字符串,通过打印日志发现一个String的字符串用json序列化后没有什么变化。

2.  实际上返回到前台的类型是不一样的。一个是纯文本,一个json格式。尽管看起来是一样的,实际上是不同的(因为String在java是一个对象,不是原生类型,所以用json处理后是有变化,详细变化没有时间细纠。先记住)。

这一点一定要注意

3.  假设ajax要求返回的是json串。无论后台的处理类型是什么,最好都通过json进行序列化一下,即便是普通类型



结论:

因为返回的内容不是json格式,是string格式。根本问题还是因为js的类型和返回的类型不一致。

以上是关于jquery ajax參数加点号状态200进error的主要内容,如果未能解决你的问题,请参考以下文章

调用jquery.ajax(),http状态码200,却执行error事件。

ajax回调error但状态码是200 2018-09-11

Ajax传值后台状态值为200却进入ERROR函数中

关于iframe和div窗口中ajax请求200状态时执行的回调问题

jQuery 的 ajax 方法,返回结果 readyState=4 并且 status=200 时,还进 error 方法

CORS - jQuery 获取 ajax 响应状态失败