App Engine HTTP状态代码消息

时间:2011-08-17 14:52:30

标签: java google-app-engine http-status-code-400

我发现Java的dev_appserver和实时App Engine服务器之间存在不一致。

在我的本地开发服务器上,我有一个返回的Servlet:

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

当我访问该页面时,我在标题中返回一个状态代码消息:

Status Code:400 Please log in to comment

当我将此部署到App Engine时出现问题。当访问同一个servlet时,我收到“Bad Request”而不是“Please log in comment”:

Status Code:400 Bad Request

Please log in to comment状态代码消息显示在内容HTML中,但不会出现在标题中,就像在开发环境中一样。

为什么会这样?

修改

以下是dev_appserver和production的curl -vvvv跟踪:

dev_appserver curl trace:

> 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

2 个答案:

答案 0 :(得分:4)

我想说prod系统是正确的实现。 sendError()的javadoc说:

  

使用指定的状态向客户端发送错误响应。的的   服务器默认创建响应看起来像   包含指定消息的HTML格式的服务器错误页面,   将内容类型设置为“text / html”,留下cookie等   标题未经修改。如果已为此进行了错误页面声明   对应于传入的状态代码的Web应用程序,它将是   优先服务于建议的msg参数。

     

如果响应已经提交,则此方法抛出一个   IllegalStateException异常。使用此方法后,响应应该是   被认为是承诺,不应写入。

我突出了一个部分。这说它只是在可能的情况下返回带有消息的html页面。它没有说它在HTTP状态代码中使用它(我个人也没有在任何地方看到它:()

答案 1 :(得分:1)

sendError没有特别的问题。 setStatus方法的行为方式相同。在普通Java下,sendErrorsetStatus都会设置状态描述。问题是生产App Engine服务器始终将状态描述设置为每个代码的标准描述。