操作Play 2.2 Scala中的响应状态文本

时间:2014-10-15 00:20:35

标签: http playframework-2.2

有没有人知道如何操作Scala Play 2.2中的HTTP状态文本? 我发现指定状态代码很容易,但没有附带的文本。

我感兴趣的原因是我正在尝试模拟完全我需要使用的Web服务,并将特定信息放在状态文本中。

例如,当登录尝试失败时,我将从此服务获得以下代码段(curl输出):

< HTTP/1.1 401 username or password invalid
< ...

当我从我的Mock服务返回未经授权的回复时,我得到以下内容:

< HTTP/1.1 401 Unauthorized
< ...

如果首先有可能,我显然错过了实现这一目标的真正方法。

以下是我如何构建未经授权的响应:

Unauthorized(views.html.invalidlogon(message)).withHeaders(
  CONTENT_TYPE -> "text/plain"
)

这是我想在虚构的天真世界中做的事情:

Unauthorized(views.html.invalidlogon(message)).withHeaders(
  CONTENT_TYPE -> "text/plain"
).setStatusText(message)

感谢您的帮助!

修改 - 其他信息

事实证明,我真正想要的是原因短语。

根据RFC他们说以下内容:

  

此处列出的原因仅是建议 - 它们可以替换为本地等效项而不影响协议。

特别感兴趣的是对现有的错误代码使用 MAY

但是,如果在播放中我返回自定义4XX错误,则原因短语只是在4XX状态分类后的客户端错误。能够控制原因短语以便随附自定义响应状态代码会很好。

2 个答案:

答案 0 :(得分:0)

事实上的响应状态是HTTP specification的数值,因此它在Play中被硬编码。

如果您真的需要这样as suggested in answer to other question,最好添加自定义标题,即:

Unauthorized("You can't login now, sorry...").withHeaders(
  CONTENT_TYPE -> "text/plain; charset=utf-8",
  "X-Error-Message" -> "Login or password invalid"
)

提示:出于安全考虑,请在登录过程中注意过于描述性的错误消息。

答案 1 :(得分:0)

在查看Play代码后,我认为目前不可能。

如果你看here,他们会执行以下操作:

def createNettyResponse(header: ResponseHeader, closeConnection: Boolean, httpVersion: HttpVersion) = {
  val nettyResponse = new DefaultHttpResponse(httpVersion, HttpResponseStatus.valueOf(header.status))
...

HttpResponseStatus.valueOf(header.status)的调用不允许添加Reason Phrase。

在纯粹虚构(可能可疑)的世界中,以下变化可能允许这样做:

def createNettyResponse(header: ResponseHeader, closeConnection: Boolean, httpVersion: HttpVersion) = {
  val nettyResponse = header.reasonPhrase match {
    case Some(reasonPhrase) => new DefaultHttpResponse(httpVersion, HttpResponseStatus(header.status, header.reasonPhrase))
    case _ => new DefaultHttpResponse(httpVersion, HttpResponseStatus.valueOf(header.status))
  }
  ...

但是这样的改变会产生很大的连锁反应。

所以如果我是对的,这是不可能的,我会看到Play人们的想法。

感谢