有没有人知道如何操作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状态分类后的客户端错误。能够控制原因短语以便随附自定义响应状态代码会很好。
答案 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人们的想法。
感谢