2011-08-17 115 views
4

我發現Java的dev_appserver與實時App Engine服務器之間存在不一致。App Engine HTTP狀態代碼消息

在我的本地開發服務器,我有一個Servlet返回:

return response.sendError(response.SC_BAD_REQUEST, "Please log in to comment"); 

當我訪問的頁面,我回去在標題狀態碼的消息是:

Status Code:400 Please log in to comment 

問題當我將它部署到App Engine時。當訪問同一個servlet我得到這個「錯誤的請求」,而不是「請登錄後發表評論」:

Status Code:400 Bad Request 

,因爲它在不出現在內容HTML的Please log in to comment狀態代碼的消息,但不是在頭開發環境。

這是爲什麼?

編輯

這裏的curl -vvvv痕跡兩個dev_appserver和生產:

dev_appserver捲曲跟蹤:

> POST /add-comment HTTP/1.1 
> User-Agent: Mozilla/4.0 
> Host: localhost:8080 
> Accept: */* 
> Content-Length: 9 
> Content-Type: application/x-www-form-urlencoded 
>   
< HTTP/1.1 400 Please log in to comment 
< Content-Type: text/html; charset=iso-8859-1 
< Cache-Control: must-revalidate,no-cache,no-store 
< Content-Length: 1406 
< Server: Jetty(6.1.x) 

生產捲曲跟蹤:

> POST /add-comment HTTP/1.1 
> User-Agent: Mozilla/4.0 
> Host: www.xxx.org 
> Accept: */* 
> Content-Length: 9 
> Content-Type: application/x-www-form-urlencoded 
> 
< HTTP/1.1 400 Bad Request 
< Content-Type: text/html; charset=utf-8 
< Vary: Accept-Encoding 
< Date: Thu, 18 Aug 2011 14:04:26 GMT 
< Server: Google Frontend 
< Cache-Control: private 
< Transfer-Encoding: chunked 
+1

您可以爲兩個調用devappserver和production添加curl -vvvv跟蹤嗎? – proppy

+0

@proppy:編輯 –

回答

3

我想小號這個產品系統是正確的實施。 javadocs sendError()說:

使用指定的狀態向客戶端發送錯誤響應。 的 服務器默認創建響應看起來像包含指定消息, 設置內容類型爲「text/html的」,留下Cookie和其他 標頭未修飾的 HTML格式的服務器錯誤頁。如果對與傳入的狀態代碼相對應的 Web應用程序進行了錯誤頁面聲明,則將優先於 回送建議的msg參數。

如果響應已被提交,則此方法會拋出 IllegalStateException。使用此方法後,響應應爲 認爲已提交且不應寫入。

我突出顯示了一個部分。這表示它只是在可能的時候返回一個帶有消息的html頁面。它並沒有說它在HTTP狀態代碼中使用它(我個人還沒有看到任何地方:()

+0

有趣。看起來你是對的。沒有任何關於狀態碼消息的內容。 Jetty(dev_appserver)似乎將其顯示爲HTTP狀態消息,但其他人可能不會。我想知道是否有辦法在App Engine環境中強制它 - 我想能夠在標題中設置自己的狀態消息應該是人們可以做的事情。 –

1

這不是一個特別的問題sendErrorsetStatus方法的行爲方式是一樣的。在普通的Java中,sendErrorsetStatus都會設置狀態描述。問題是生產App Engine服務器始終將狀態描述設置爲每個代碼的標準描述。