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