如果由于非2xx状态代码而导致Content-Negotiation无法找到合理的结果,那么正确的回退是什么?例如:
客户想要下载PDF并发送以下标题Accept: application/pdf
。由于权限不足,服务器将返回403 Forbidden
。您可能希望更详细地解释原因,但返回PDF没有多大意义。你会如何处理?
服务器应该返回空体吗?他应该忽略Accept
标题并发送一些其他表示,例如text/plain
。或者客户的工作是按Accept: application/pdf, text/plain, */*
提供替代方案。
答案 0 :(得分:2)
显然,如果用户没有访问资源的权限,那么服务器无法做出真正的替代方案。然而,如果可以使用客户端接受的media-type
进行响应,则服务器可以响应内容(即使在错误情况下)更详细地描述错误。客户端应提供Accept:
标头,描述它可以解析的所有media-type
。所以自动客户端可以做到:
Accept: application/pdf, application/vnd.myapi.error
如果内容协商失败,则返回的代码应为406 Not Acceptable
。如果服务器无法提供客户可接受的任何答案,则可以生成此服务器。
但是,规范声明服务器可能实际返回客户端未明确接受的答案(如果需要),由客户端来检查响应头以查看{ {1}}答案是。