如果出现问题,我们正在使用HTTP状态代码作为响应代码开发标准REST服务。 (例如,无效的用户输入会向客户端返回“400 Bad Request”)
但是,我们认为更详细的错误消息对客户端有用。 (例如,无效输入错误是由于X是无法识别的参数名称)
我们希望尽可能忠实于HTTP规范,因此在研究了RFC2616中的规范之后,我们考虑将详细的错误消息放在HTTP标头中,特别是{{3 }}。它在RFC上说:
警告通用标头字段用于携带有关可能未在消息中反映的消息状态或转换的其他信息。此信息通常用于警告缓存操作或应用于消息实体主体的转换可能缺乏语义透明度。
对于其他警告(例如REST错误消息)使用此标头似乎没有任何限制,即使是根据此标头的初始意图与缓存警告无关的警告也是如此。我们喜欢语义,我们计划使用299警告代码,这似乎很合适:
299杂项持续警告警告文本可能包含要呈现给人类用户或已记录的的任意信息。接收此警告的系统不得采取任何自动操作。
因此,鉴于此问题顶部显示的无效输入错误情况,我们正在考虑将REST错误消息添加如下示例:
HTTP/1.1 400 Bad Request
Warning: 299 ServiceName "Invalid input error: X is unrecognized parameter name."
这是一个好主意/实践吗?我们还发现一些服务在X-Warning标题中详述了此消息,但这似乎不是标准的。我们想知道stackoverflow REST人群的蜂巢智慧会对此有何看法。是否还有更好/标准化的做法可以在REST响应中传递详细的错误消息?
答案 0 :(得分:16)
为什么不改变原因短语?这就是它的用途。 “错误请求”文本只是默认值。如果要包含更多信息,请使用响应正文。 HTTP规范说你应该包含一个包含错误详情的响应正文。
更新
基于对RFC 7231和相关材料的更新阅读,似乎更改原因短语的唯一正当理由是本地化文本,而不是提供更具体的含义。对不起。
答案 1 :(得分:4)
无论您在何处提供反馈,无论是在邮件正文(内容)还是警告标题中,都要小心避免提供任何可能对攻击者在您的系统上进行渗透测试有帮助的信息。
有时候信息越少越好。
答案 2 :(得分:1)
我赞成只在请求成功时才使用标头警告。
例如,获取用户详细信息的服务,但某些细节来自经常发生故障的第三方。在我们的例子中,将用户数据的该部分留空是合适的,但是向用户显示一些数据丢失的警告。
因此请求返回200 Success,其中包含我们可以检索的所有内容的有效负载,但是后面有警告标题,描述了其余的错误。
答案 3 :(得分:0)
我赞成一般方法。我们应该假设客户开发人员与服务开发人员处于不同的团队,可能在不同的时区等。可能甚至是一个不同的公司。仅仅返回“没有那个糟糕的请求”响应并不好,客户如何解决问题。
如此哲学:告诉客户他们有责任解决的问题。纯粹是服务器范围的错误(例如数据库连接错误或某些逻辑问题)只返回500错误是公平的。在这里,我不会发回任何细节,我们不希望向客户公开我们内部实施的细节。
到目前为止,我一直在使用JAX / RS返回响应正文中的数据:
return Response.status(400).entity("some message here").build();
我认为你使用标题可能实际上是一个更清晰的appraoch。
答案 4 :(得分:0)
如果接受this proposal,它将提供发送详细错误消息的替代方法。 [http://tools.ietf.org/html/draft-nottingham-http-browser-hints]
尽管它是I-D,但它最近相当稳定,我认为构建自己的实现没有问题。 (我已经完成了。)
答案 5 :(得分:0)
429请求太多(RFC 6585) 用户在给定的时间内发送了太多请求。用于速率限制方案。
由于每个生命周期允许一个请求,因此您正在实施速率限制方案,因此这是适当的HTTP响应。
您也可以(并且受到HTTP规范的鼓励)自定义HTTP响应主体,以便您可以更改" Too Many Requests"你想要的任何解释。