2011-08-17 128 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服务器始终将状态描述设置为每个代码的标准描述。