如何处理接受不同 Accept header 值的 REST 端点中的错误响应。

How to handle error responses in a REST endpoint that accepts different Accept header values.

我正在尝试向 REST 端点添加新的内容类型。目前它只有 returns json 但我现在需要能够 return 也是一个 CSV 文件。

据我所知,最好的方法是使用 Accept header 和值 text/csv 然后添加一个能够对此做出反应的转换器并将 returned body 转换为正确的 CSV 表示。

我已经能够做到这一点,但是我在处理异常时遇到了问题。直到知道,所有错误 returned 都在 json 中。前端期望任何 500 状态代码包含特定的 body 错误。但是现在,通过将选项添加到 return application/jsontext/csv 到我的端点,以防出现错误,用于转换 body 的转换器正在运行成为 jackson 转换器或我的自定义转换器,具体取决于通过的 Accept header。此外,我的前端将需要读取 content-type returned 并根据 returned 的表示类型解析值。

这是处理这种情况的正常方法吗?

一个更快的解决方法是忘记 Accept header 并包含一个 url 参数来指示预期的格式。这样做,我将能够直接在控制器中更改响应的 content-type 和数据解析,因为 GET 请求将不包含任何 Accept header 它将能够接受任何东西。代码的某些部分已经这样做了,其中唯一预期的响应格式是 CSV 所以我将很难捍卫 Accept header 的使用,除非有更好的处理方式。

my frontend is going to need to read the content-type returned and parse the value based on the type of representation returned.

Is this the normal approach to handle this situation?

是的。

例如,RFC 7807描述了描述问题的通用格式。因此,服务器将在响应中发送 application/problem+jsonapplication/problem+xml 问题表示,以及 headers.

中的常用元数据

理解 application/problem+json 的消费者可以使用 in 解析数据,并将对问题的有用描述转发给 user/logs whatever。 理解的消费者仅限于根据 headers 中的信息采取行动。

A faster workaround would be to forget about the Accept header and include a url parameter indicating the format expected.

这也很好 - 更准确地说,您可以让不同的资源负责您支持的每个不同 media-types。

复习一下描述内容协商语义的 section 3.4 of RFC 7231 可能会有用。