前台ajax请求php后台返回成功却进error方法解决

  最近几天一直都在解决error问题,周末都没能好好过,悲痛万分,想逃走??.....

一、悲痛的开端

  项目用jQuery的ajax方法请求php后台,前台代码写的没有问题,后台返回的json数据大概也是对的(猜的,后来验证了json是对的),然后悲剧就如约而至;

  先看核心代码:

              $.ajax({
                        type:"POST",
                        url:"{:U(‘City/adds‘)}",
                        data:{},
                        dataType: ‘json‘,
                        success:function(data){if( data.status == 1 ){
                                layer.msg(‘成功* ̄▽ ̄*‘);
                                setInterval(function(){
                                    var index = parent.layer.getFrameIndex(window.name);
                                    parent.layer.close(index);
                                    window.parent.location.reload();
                                },1000)
                            }else{
                                layer.msg(‘失败>﹏<‘);
                            }
                        },
                        error: function (XMLHttpRequest, textStatus, errorThrown) {
                            //console.log(XMLHttpRequest.status);
                            //console.log(XMLHttpRequest.readyState);
                            //console.log(textStatus);
                        }
                    })        

  问题一:请求成功进入success方法,但出现下面的报错,

 Uncaught SyntaxError: Unexpected token < in JSON at position 0

  翻一下Network面板,看到请求响应的数据是 <pre>array(3){...}</pre>  字符串,继续忍...

  开始分析找解决办法;

  报错代码是“JSON位置0处发现不能识别的标记<”,意思是说响应的数据不是json数据,那就各种各样的方法试一试;

  先尝试改前端代码,不指定‘dataType’,在success中方法去掉<pre></pre>,发现就不会报错了,但问题二来了;

  去掉<pre></pre>,用的是:jQuery(data).text()

  问题二:请求成功但一直进入error方法,无任何报错;

  

  Preview下是json数据,校验无任何问题;

  Response下发现数据前面多了一个小红点·,是数据的问题,ajax死活都不给解析,才一直进入error方法;

  然后跟后台商量,返回的数据有问题,需要注意下格式;

  我就去百度搜索啊,发现真是后台数据的问题,没有注意过红点问题;

  在后端返回数据前用方法ob_clean()清空输出,返回的类型是Object,不再是String,由此成功~~

 二、开心的结局,啰嗦聊几句

  问题一和问题二都能在后台用ob_clean()完美解决。

  问题一是在前台解决,但对于数据量多的情况并不适用,所以慎用;可以让后台尝试 echo json_encode($data,true);  echo json_encode($obj,JSON_UNESCAPED_UNICODE);  或者自己来~ 方法多种多样,总有适合的一个;

  总结问题一和问题二,都是一个问题引出  -> Json数据不够严谨,导致前台解析出错。

  Json数据不够严谨就更得说了,例如一个全角和半角的空格、单双引号出现的{k:v}、json中的注释语句等一些细小的问题都会引起;如果大家也遇上了同样的问题,但不能用同样的方式解决,一定要找各方面的原因,不要局限于ajax代码部分有没有写错,后台给的确实是json,而是去找类型/解析/书写/空传值等情况分析,不同代码不同分析方式;

  最后硬要说是谁的锅,不好讲,还是需要前端和后台一起配合才更好更快的完成??。

  记录一下此次的解决过程,感谢大家~??

  

  

原文地址:https://www.cnblogs.com/anniey/p/9167129.html

时间: 2024-10-10 14:15:46

前台ajax请求php后台返回成功却进error方法解决的相关文章

JQuery AJAX请求aspx后台方法

利用JQuery封装好的AJAX来请求aspx的后台方法,还是比较方便的,但是要注意以下几点: 1.首先要在方法的顶部加上[WenMethod]的特性(此特性要引入using System.Web.Services;命名空间) 2.其次方法一定要是静态(static)方法. 下面我做了几个不同的调用后台方法的例子: 1.不带参数返回string方法 前台代码: 1 //不带参数返回string方法 2 $.ajax({ 3 type: "post", 4 url: "后台返回

ajax请求且带返回值的代码实例

ajax请求且带返回值的代码实例: 现在比较流行使用jquery的ajax来实现一些无刷新请求效果,本章节提供一个非常简单的代码实例供大家参考之用,希望能够给需要的朋友带来一定的帮助,代码如下: <script type="text/javascript"> /* 请求Ajax 带返回值,并弹出提示框提醒 --------------------------------------------------*/ function getAjax(url,parm,callBa

AJAX请求时status返回状态明细表

AJAX请求时status返回状态明细表 readyState的五种状态2010-03-04 18:24对于readyState的五种状态的描述或者说定义,很多Ajax书(英文原版)中大都语焉不详 在<Pragmatic Ajax A Web 2.0 Primer >中偶然看到对readyStae状态的介绍,感觉这个介绍很实在-- 比较理想的解释方法应该以"状态:任务(目标)+过程+表现(或特征)"的表达模式来对这几个状态进行定义 在<Pragmatic Ajax A

ajax请求、servlet返回json数据

ajax请求.servlet返回json数据 1.方式一 response.setcontenttype("text/html;charset=utf-8"); response.setheader("cache-control", "no-cache"); string str = "{'msg':'成功','success':'true'}"; out.print(str); out.flush(); out.close(

Ajax 请求时后台跳转 前端页面不更新踩坑记录

踩坑环境:前端:Ajax post请求,json类型数据:后端 C#+MVC,前后端正常通信,但是当后台验证权限不通过时会RedirectToAction跳转到登录页,结果现象是后台正常执行登录页的渲染,渲染完成之后前端ajax进入error,页面不刷新. 经检查页面不跳转是因为后台渲染页面后以字符串形式返回,被ajax接收,有因为前端设置json格式所以进入error,看来需要后台返回状态和url,前端js来进行页面跳转,但总感觉这样不太方便,继续研究一下能否实现后台跳转,有方案再来更新内容.

Shiro Ajax请求没有权限返回JSON,没有登录返回JSON

本文基于Shiro权限注解方式来控制Controller方法是否能够访问. 例如使用到注解: @RequiresPermissions 来控制是否有对应权限才可以访问 @RequiresUser 来控制是否存在用户登录状态才可以访问 想了解Shiro是如何通过注解来控制权限的,可以查看源码 AopAllianceAnnotationsAuthorizingMethodInterceptor ,其构造方法中添加了几个对应的权限注解方法拦截器(这里不做详细阐述). 用户在请求使用这些注解方式控制的方

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

今天在使用jquery.ajax方法去调用后台方法时,ajax中得参数data类型是"JSON",后台DEBUG调试,运行正常,返回正常的结果集,但是前端一直都进到ajax的error方法,百思不得其解,后要一探究竟,在error方法的参数中加了data后,发现data中的readyState = 4 并且 status=200,这两个状态也证明ajax访问没有问题,没有出现异常.回过头发现我在后台返回的是字符串,但并不是标准的json格式的字符串,所以前端js进入不了success.

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

今天开发中遇到一个非常恶心的问题: 用jquery中的ajax提交.发现假设參数中有点号的參数.后台正常返回200状态码的情况下也会走到error:function. 1. 參数data: "topicAbstractInfoVO.belongSubjectId="+subjectId 2. 參数data:"belongSubjectId="+subjectId, 请求正常返回,状态为200. 第一种情况,跳到了error处理块.另外一种情况跳到success处理块

苹果 ios 微信浏览器界面 ajax 提交带 file 的 form 总是走error方法

1. 问题 问题出在微信端,而且是苹果机的微信端(苹果你咋这么矫情,安卓正常).:代码还是之前的代码,貌似是苹果升级系统后部分版本出现的 BUG,后来证明确实跟 ios 版本有关,网上也找过类似的解决措施: 2. 解决方法 2.1 添加 async: false(未验证) function saveUser() { $.ajax({ type:"POST", url:"SaveUser.action", data:$('#fm').serialize(), data