我正在構建一個基於REST的Web服務,它將服務於幾百個客戶端,它們將全天上傳/請求一小撮信息,並且每天進行一次更大的緩存更新(大約100-200kb)。來自Web服務器的異常高速腐敗JSON響應,原因和解決方案?
在測試生產計算機上的大型更新(運行Apache/PHP的雲中的Linux虛擬機)時,我發現我非常沮喪地發現數據到客戶端損壞(即有一個或多個錯誤字符)時代。損壞的JSON的
例,解析器說SyntaxError: JSON.parse: expected ':' after property name in object at line 1 column 81998 of the JSON data
:
"nascita":"1940-12-17","attiva":true,","cognome":"MILANI"
應該
"nascita":"1940-12-17","attiva":"true","cognome":"MILANI"
這就是答案
Connection Keep-Alive
Content-Type application/json
Date Fri, 02 Jun 2017 16:59:39 GMT
Keep-Alive timeout=5, max=100
Server Apache/2.4.18 (Ubuntu)
Transfer-Encoding chunked
的HTTP標頭我當然不是專家當涉及到網絡,但我曾經認爲這樣的事件,失敗的IP和TCP錯誤檢測都非常少見。 (我發現這個帖子很有意思: Can a TCP checksum produce a false positive? If yes, how is this dealt with?)
那麼......這裏怎麼回事?我錯過了什麼嗎?
我開始想到可能的解決方案。
我能想到的最快的就是使用HTTP壓縮:如果客戶端無法解壓內容(這很可能在數據損壞的情況下),那麼我可以再次請求內容。 我在Apache上啓用了此功能,但令我意外的是,所有響應均使用有效數據完成。 難道網絡瀏覽器(我使用的是舊的Firefox測試Web服務)有一些內置機制來重新請求損壞的壓縮數據嗎?或者,MAYBE壓縮數據的規模較小,性能較差會使TCP/IP出錯的可能性降低?
我想到的另一個快速解決方案是計算內容的校驗和,我可以對較小的請求執行某些操作,這些請求不會從壓縮中受益。 我想弄清楚是否以及如何在HTTP中的Content-MD5字段可以幫助我...網頁瀏覽器似乎忽略它,所以我想我將不得不計算和明確地比較它在我的客戶端...
使用TLS可能是另一個好主意,可能是最好的。
還是......我錯過了什麼東西巨大? 像,我不知道,出於某種原因,我的Apache使用UDP?
你能提供它如何被破壞的例子嗎? – Fletchius
你在上傳什麼,如何?你如何試圖解碼上傳?是什麼讓你說數據損壞? –
它是JSON數據,firefox試圖解析它並告訴我哪些列包含錯誤 –