业务逻辑如下:
1、前端ajax调用后台controller方法,controller中调用外部http接口,封装了一个HttpURLConnection对象的调用方法。目前对端接口还未完成,所以本地编写接口接收http请求处理并返回。前端页面始终报:
SyntaxError: Unexpected end of JSON input
at parse (<anonymous>)
at Ut (jquery-3.3.1.min.js:2)
at k (jquery-3.3.1.min.js:2)
at XMLHttpRequest.<anonymous> (jquery-3.3.1.min.js:2)
at Object.send (jquery-3.3.1.min.js:2)
at Function.ajax (jquery-3.3.1.min.js:2)
at findWorkOrderInfo (initGroup.action?userId=402880e92db726b5012db729f65f0001&groupId=403880e92db726b5012db729f65f0002&chatId=297e60f264f472170164f501db7d038e:66)
at HTMLImageElement.onclick (initGroup.action?userId=402880e92db726b5012db729f65f0001&groupId=403880e92db726b5012db729f65f0002&chatId=297e60f264f472170164f501db7d038e:135)
前端代码大致如下:
$.ajax({
url : url,
data : data,
dataType : 'json',
type : 'POST',
async:false,
success : function(obj) {
},
error:function(data,type,err){
console.log(data);
console.log(type);
console.log(err);
}
});
检查过多次没有什么问题,基本上可以判断是后台返回数据的问题。
1、现在开始debugger后台代码,首先根据错误怀疑是拼接的json串不符合格式,因此在返回语句将结果字符串拷贝出来检查,发现没有问题;
2、然后将代码都注释掉,只保留返回json串的语句,直接返回结果,前端页面正确解析,因此怀疑是处理逻辑中存在问题。
3、会出问题的代码主要集中在调用外部接口返回数据的部分,将这部分代码注释掉,返回固定结果,前端正确解析,因此确定是调用接口的问题。
4、因为报错是Unexpected end of JSON input,怀疑是否是请求头设置的问题,但是请求外部接口时设置的Content-Type确实是application/json;charset=UTF-8,然后开始检查封装的接口调用方法,一步步注释掉测试定位到问题出在HttpURLConnection对象调用getInputStream()方法这里,因为这个方法是真正执行发送请求的方法,就开始怀疑是否是request对象或response对象出了问题。
5、因为编写的测试接口返回结果使用的是response.getWriter().println()方法返回字符串,并且debug看到返回的结果也没有问题。怀疑是否是response对象的一些属性有问题,然后在debug过程中偶然将外部接口中的response对象和ajax调用的controller方法中的response比较了一下,发现response对象的ID相同。。。到这了问题基本上找到了,我们知道一个request只能对应一个response,即response对象只能使用一次,因为我调用外部接口就使用了这个response对象,导致再返回结果给ajax时再使用这个response对象就出问题了。然后发现我编写的测试接口和ajax调用的方法都在一个controller类中,这就导致它们使用的是相同的response对象。
6、到这里问题基本上清楚了,将编写的测试接口放到一个新的controller类中,这样ajax调用的方法和外部接口就不在一个controller类中了,当在后台再次调用外部接口时就会使用新的response对象,获取结果之后再通过原来的response对象返回结果到前端,测试成功。。。
这里也算是给自己挖了个坑,以后在对端接口还未完成,自己编写接口进行测试时,要记得不要偷懒和调用方写在一个类中,也许就会在两次调用使用同一个response对象,导致出现难以察觉的错误。。。