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