我有一个带有 purchase 资源的REST API,每次购买都有一个 receipt 子资源,它返回一个包含购买信息的pdf文档 .
要创建购买,客户端会执行以下操作:
POST /purchase
并且客户端将在购买的JSON表示中获得 201 Created
HTTP响应 .
然而,大多数客户希望在以下位置收到pdf收据:
GET /purchase/{id}/receipt
客户端可以执行 POST /purchase
,接收新资源的ID并调用 GET /purchase/{id}/receipt
来下载收据,但这意味着要发出2个请求而不是1个 .
是否有一种RESTful方式来指示在成功创建资源后要接收哪个子资源?
1 回答
根据要求,我将我的评论转换为答案:
REST使用HTTP作为客户端和服务器之间交换的消息的传输层 . 鼓励客户端和服务器遵守HTTP的语义(以及其他一些约束),以保持互操作性并将客户端与服务器API分离 .
HTTP提供内容类型协商的概念,其中客户端可以向服务器请求某种表示格式以接收响应 . 客户端通过发出请求的Accept header来表达他的意图 . 它还可以向服务器提供客户端支持的表示的列表,包括每个媒体类型的权重参数,其告知服务器每种媒体类型的优先顺序 . 如果客户端同时支持PDF和JSON但更喜欢PDF而不是JSON,它只需发送一个包含类似 Headers 的请求
与请求 .
如果服务器能够将资源状态转换为这两种表示格式,则鼓励返回PDF表示,因为客户端更喜欢这种格式而不是另一种格式 . 如果服务器没有创建表示,客户端可以理解它必须返回406 Not Acceptable状态代码作为响应 .