把详细的REST错误消息放在HTTP警告头,好/坏主意?

如果出现问题,我们正在开发一个使用HTTP状态代码作为响应代码的标准REST服务。 (例如,无效的用户input将向客户端返回“400错误请求”)

但是,我们觉得更详细的错误信息对于客户是有用的。 (例如,无效input错误是由于X是无法识别的参数名称)

我们希望尽可能忠实于HTTP规范,所以在研究了RFC2616中的规范后,我们正在考虑将详细的错误消息放在HTTP头中,特别是在HTTP头警告字段中 。 它在RFC上说:

警告通用标题字段用于携带有关消息的状态或转换的附加信息,这些消息可能不会反映在消息中 。 这些信息通常用于警告caching操作或应用于消息的实体主体的转换可能缺乏语义透明度。

对于其他警告(比如REST错误消息),使用这个头文件似乎没有任何限制,甚至那些与这个头文件的初始意图无关的caching警告也是如此。 我们喜欢语义,我们计划使用299警告代码,这似乎很适合这个法案:

其他持续性警告警告性文本可能包含任何要呈现给用户的信息或logging 。 接收到此警告的系统不得采取任何自动操作。

所以,考虑到在这个问题的顶部提出了无效的input错误的情况下,我们正在考虑把我们的REST错误消息,如下面的例子:

HTTP/1.1 400 Bad Request Warning: 299 ServiceName "Invalid input error: X is unrecognized parameter name." 

这是一个好主意/练习吗? 我们还发现一些服务在X-Warning标题中详细描述了这个消息,但是这似乎不是标准的。 我们想知道,stackoverflow REST人群的蜂巢智慧会怎么想呢? 在REST响应中是否还有更好的/标准化的实践来传递详细的错误消息?

为什么不只是改变原因呢? 这就是它的目的。 “错误的请求”文本是默认的。 如果你想包括更多的信息,那么使用响应主体。 HTTP规范说,你应该包括一个错误的详细信息的响应主体。


UPDATE

基于对RFC 7231和相关资料的更新阅读,似乎改变原因短语的唯一正当理由是本地化文本,而不是提供更具体的含义。 对于那个很抱歉。

无论您在何处提供反馈,无论是在邮件正文(内容)还是在警告头中,都要小心避免提供任何可能有助于攻击者在您的系统上进行渗透testing的信息。

有时候更less的信息更好。

我赞同一般的做法。 我们应该假设客户端开发人员与服务开发人员在不同的团队,也许在不同的时区等等。可能甚至是不同的公司。 回复“不是一个错误的要求”的回应是不好的,客户如何解决这个问题。

所以哲学上:告诉客户他们有责任去解决的事情。 错误纯粹是服务器的范围(例如,数据库连接错误,或者一些逻辑问题),仅仅返回500错误是公平的。 在这里,我不会再发送任何细节,我们不想向客户公开我们内部实施的细节。

到目前为止,我一直使用JAX / RS返回响应正文中的数据:

 return Response.status(400).entity("some message here").build(); 

我在想,你使用标题可能实际上是一个更清洁的指标。

如果此提议被接受,它将提供发送详细错误消息的替代方法。 [ http://tools.ietf.org/html/draft-nottingham-http-browser-hints ]

尽pipe它是一个ID,但最近还是相当稳定的,而且我认为在构build自己的实现方面没有问题。 (我已经做好了。)

429太多的请求(RFC 6585)用户在给定的时间内发送了太多的请求。 旨在用于速率限制scheme。

由于每个生命周期允许一个请求,因此您正在实施速率限制scheme,所以这是适当的HTTP响应。

您也可以(并且受到HTTP规范的鼓励)自定义HTTP响应主体,因此您可以将“请求太多”更改为您想要的任何解释。