如何在成功创建资源后告诉REST API接收哪个子资源

时间:2018-04-11 21:08:56

标签: rest api http

我有一个带有购买资源的REST API,每次购买都有一个收据子资源,该子资源返回包含购买信息的pdf文档。

要创建购买,客户端会执行以下操作:

POST /purchase

客户端将根据购买的JSON表示获得201 Created HTTP响应。

然而,大多数客户希望在以下地址收到pdf收据:

GET /purchase/{id}/receipt

客户端可以POST /purchase,接收新资源的ID并致电GET /purchase/{id}/receipt下载收据,但这意味着要发出2个请求而不是1个。

是否有一种RESTful方式来指示在成功创建资源后要接收哪个子资源?

1 个答案:

答案 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状态代码作为响应。