来自具有特定“接受”标头的请求的错误响应正文格式

Posted

技术标签:

【中文标题】来自具有特定“接受”标头的请求的错误响应正文格式【英文标题】:Error response body format from a request with specific "Accept" header 【发布时间】:2019-06-29 04:34:00 【问题描述】:

我的 HTTP/Rest API 有一个资源端点,可以处理通过请求的“Accept”标头指定的“application/json”和“text/csv”响应正文格式。

如果出现错误,例如 HTTP 400、500 响应等,我想知道应该使用什么响应正文格式来返回错误信息。如果与application/json 一起使用,很明显错误信息必须是 JSON 格式。但是在 text/csv 或任何其他“异国情调”的 mime 类型的情况下使用什么格式?

【问题讨论】:

我不确定这里是否有正确/错误的答案,但我认为无论请求如何,错误消息正文都应该是一种类型(即application/json)。这是为了简化消费者的错误处理。根据您的服务,您的消费者可能对一个请求使用 CSV,对另一个请求使用 XML,以及 JSON。最后,当确实发生错误时,处理一致的错误响应是理想的。 @MoA 我想知道关于这个主题是否有某种“最佳实践”。这对我来说似乎也是最好的解决方案。 刚刚环顾四周,发现 UK Land Registry API(相当成熟的 API)可以以 CSV、XML、JSON 等方式响应。它们根据格式返回错误,而不是设置为一种类型(即与我建议的相反)。在GET http://landregistry.data.gov.uk/data/ppi/address.json?town=LONDON 周围玩一玩。您可以将.json 更改为.csv.xml。我知道它并不完全在您指定的标题上,但结果可能是相关的。也许根据类型设置错误响应是正确的方法。 似乎此 API 在错误时返回“text/javascript”内容类型,无论文件扩展名是什么(这是另一种格式检测方法)。至少出现这种错误:GET http://landregistry.data.gov.uk/data/ppi/address.json?ggre=gregr。此查询字符串错误的请求以“text/javascript”格式返回 HTTP 500,响应正文中包含 html 没错。另一个灵感来源是 Oracles API,它返回 JSON 或 XML - https://docs.oracle.com/en/cloud/iaas/messaging-cloud/csmes/using-rest-api.html#GUID-5EA9CC73-0639-4560-8699-706D5A96FB03(错误响应)。 【参考方案1】:

如果没有任何格式可用,HTTP 服务器可以随意忽略 Accept 标头。

鉴于没有真正的“标准”CSV 错误响应,我会默认为application/problem+jsontext/html 甚至text/plain

【讨论】:

似乎是 ihmo 的最佳解决方案。正如用户“Mo A”在原始问题的 cmets 中所说,无论接受请求和内容类型响应如何,对于整个 API 都具有相同格式的错误响应更容易让客户端处理。 @sgt-hartman 我不会普遍同意这一点。我们根据接受标头使用 text/html 错误或 application/problem+json 错误。浏览器得到一个漂亮的错误响应,而 api 客户端得到一个可解析的响应 =)

以上是关于来自具有特定“接受”标头的请求的错误响应正文格式的主要内容,如果未能解决你的问题,请参考以下文章

API Gateway - 来自 Postman 的 200 响应,来自应用的 500

我可以使用 tcpdump 获取 HTTP 请求、响应标头和响应正文吗?

Spring MVC + JSON = 406 不可接受

当服务器仅从请求中读取标头时,Http客户端不会收到响应

带有自定义标头的 Express 正文解析器

来自 http://www.google.com/ 的响应的“请求的资源上不存在‘Access-Control-Allow-Origin’标头”错误