Unexpected end of JSON input

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dongyuxu342719/article/details/82802319

业务逻辑如下:

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对象,导致出现难以察觉的错误。。。

猜你喜欢

转载自blog.csdn.net/dongyuxu342719/article/details/82802319