如果内容协商失败,那么正确的后备是什么?

时间:2016-02-24 10:19:39

标签: rest content-negotiation

如果由于非2xx状态代码而导致Content-Negotiation无法找到合理的结果,那么正确的回退是什么?例如:

客户想要下载PDF并发送以下标题Accept: application/pdf。由于权限不足,服务器将返回403 Forbidden。您可能希望更详细地解释原因,但返回PDF没有多大意义。你会如何处理?

服务器应该返回空体吗?他应该忽略Accept标题并发送一些其他表示,例如text/plain。或者客户的工作是按Accept: application/pdf, text/plain, */*提供替代方案。

1 个答案:

答案 0 :(得分:2)

显然,如果用户没有访问资源的权限,那么服务器无法做出真正的替代方案。然而,如果可以使用客户端接受的media-type进行响应,则服务器可以响应内容(即使在错误情况下)更详细地描述错误。客户端应提供Accept:标头,描述它可以解析的所有media-type。所以自动客户端可以做到:

Accept: application/pdf, application/vnd.myapi.error

如果内容协商失败,则返回的代码应为406 Not Acceptable。如果服务器无法提供客户可接受的任何答案,则可以生成此服务器。

但是,规范声明服务器可能实际返回客户端未明确接受的答案(如果需要),由客户端来检查响应头以查看{ {1}}答案是。

来源:http://tools.ietf.org/html/rfc7231#section-3.4.1