2012-08-01 60 views
1

我有時會收到一個錯誤,當我將一些參數傳遞給某個URL時,應該將某個有效請求定義爲「400 OK」。什麼會導致HTTP發送回「400 OK」

相同的URL和參數將在99%的時間內工作,但我在日誌中看到錯誤。

這是一個晦澀的事情,可能會發生由於某些因素或是特定於我的應用程序導致奇怪的標頭的混雜的東西嗎?我猜是後者,如果沒有答案,前者:)

UPDATE

的意見,「它」是寫一個比較簡單的RESTful API。現在它幾乎總是將正確的標題(如400和錯誤的正文)或正文(正文)正確地返回給200。當一個錯誤的標題發送給Web客戶端時,Web客戶端會使用所收到的消息來ping報告URL,以便我們可以區分我們的Web應用程序和移動應用程序之間的API錯誤。據我們所知,沒有可以使這個「400 OK」地獄的代碼組合。但由於看起來不可能發生在我們的代碼之外,所以我會深入研究一下。

更新2

好吧,我已經鑽研深入到我們的框架,比我有很長一段時間,並與一些開發者發言。

它通過AJAX調用將API返回給瀏覽器。

瀏覽器檢測到「400 OK」並將其發送回我們的服務器,在那裏我們得到這個奇怪的報告。沒有人看到這種情況發生在他們的眼睛上,但日誌表示正在發生。

有字面上零代碼中我們的代碼庫,將返回400 OK,因爲在我們的HTTP報頭處理程序的唯一400「400錯誤的請求」

現在我不知道是否有一些瀏覽器/ jQuery的/ AJAX的bug我迷迷糊糊進了。

更新3(因爲你不能有太多的信息)

我檢查瀏覽器是如何看待什麼是錯的。 jQuery $ .ajax報告的失敗時會觸發回調。然後,我們有這樣的代碼:

xhr.always(function() { 
    var request = [ this.type, this.url, this.data ].join(' '), 
     response = [ xhr.status, xhr.statusText, xhr.responseText ].join(' '); 

    $.ajax({ 
    url : REPORTING_URL, 
    type : 'POST', 
    data : { request : request, response : response } 
    }); 
}); 

而且我們知道這部作品的「最」的時候,因爲我們也從這些AJAX收到「400錯誤」迴應稱

UPDATE 4

我只注意到,字面上所有的錯誤來自用戶代理:

Mozilla webkit etc...... AdobeAIR/1.5.3這是一個非常舊的版本

我們的AIR應用程序只有我們的網絡應用程序的iframe。我只能想象那裏發生了什麼。

+0

它不能發回「400 OK」。這不是一個HTTP狀態碼。它可以發回「400」(錯誤的請求)。什麼對待它「確定」?也許顯示*真實*迴應標題將是有遠見的。 – 2012-08-01 21:25:49

+2

當然它可以發回「400 OK」。 「它」可以發送任何「它」喜歡的東西。他甚至沒有說出「它」是什麼!也許他自己實施了「它」。 – arkascha 2012-08-01 21:28:02

+0

@pst爲什麼呢?如果你實現它,你可以發送任何你想要的頭文件。 – arkascha 2012-08-01 21:29:33

回答

1

@ pst作爲正式答案的最佳答案後,我發現了一個更令人沮喪的答案,對我的情況來說是100%正確。

此標題是通過在Adobe AIR 1.5.3用戶的iframe中使用網站發佈的。

在強制升級所有AIR用戶之後,它就消失了,因此可以安全地認爲這是它們標題報告的錯誤。

+0

感謝您發佈的問題︰很高興問題是「解決」:)是一個錯誤/問題具體與AIR 1.5 .3然後呢? – 2012-08-27 19:25:56

+0

從一週前的強制升級以來,似乎沒有多少400 OK報告給我的服務器。所以如果將來有人遇到這種情況,他們只需要對用戶做同樣的事情。自AIR市場停止以來,強制更新有點棘手。 – 2012-08-27 23:16:35

2

好吧,我錯在我上面的評論,按照RFC 2616的Status Line的格式爲:

Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF 

的RFC接着說:

狀態碼元素是嘗試理解和滿足請求的3位整數結果代碼。這些代碼在第10節中有完整定義。原因短語旨在簡要說明狀態代碼。 狀態代碼旨在供自動機使用原因短語適用於人類用戶。客戶端不需要檢查或顯示原因詞組。

所以服務器可能返回「1.1 400 OK」。但這不會是一個精心挑選的理由 - 短語。堅持使用狀態代碼列出的原因會更好,以避免混淆。 (也許可以避免[過度]挑剔的客戶/代理問題。)

+0

感謝您的回答,我剛剛發佈了第二個更新,可能會釋放一些燈 – 2012-08-01 21:48:29

+0

要標記爲現在的答案,並期待看看我是否可以找到代碼中的實際原因 - 我已經搜索了所有400順便說一句,不只是在我們使用的http頭處理程序。 – 2012-08-01 22:12:47

+1

在接下來的一兩天內,我們將能夠引導使用舊版本AIR的所有用戶(因爲所有錯誤仍然是來自客戶端的錯誤)因此,如果錯誤消失,我必須回答我自己的問題,並說出它到底做了什麼。但我仍然保持對你的讚揚:D只是想讓你保持循環,因爲你有良好的答案 – 2012-08-06 22:53:21

相關問題