1. 程式人生 > >Unexpected end of JSON input

Unexpected end of JSON input

業務邏輯如下:

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物件,導致出現難以察覺的錯誤。。。