我需要在 RESTFul 设计中管理非常大的元素。 我试图以一种我可以吐出这些元素的方式应用“divide et impera”方法,但它会产生最小的元素,但它们仍然太大。
关于“表示”我可以使用不同的URI来管理它们。 例如。 / api / resourcex /用于资源x的最小表示 / api / resourcex_big /用于资源x的大型表示 / api / resourcex_full /用于整个资源x
ELSE
我可以使用分层方法 / API / resourcex / / API / resourcex /大 / API / resourcex /全
您认为语义上是什么?我选择第一个,因为我想保留资源的“子元素”的层次关系。
EG。我想用eg。 / api / resourcex /用于resourcesx的 list ,然后使用resourcex_big / {id}作为从resource_x列表链接的表示作为目标详细信息。然后使用resource_full进行其他类型的表示,如完整详细信息的请求。
说有一点是:我需要创建一些智能的东西,以便对该资源进行动态投影。这是因为表示对于客户来说太大了,我需要选择一些数据点以显示最符合其需求的数据点。 我的问题是:哪个是投影请求的最佳URI格式?同样,它更好的是一种分层方式(如下图所示)或查询字符串?
-- Creation of a projection
**> POST /projection/ HTTP/1.1**
{ resource:”resourcex”, “name”: true, “price”: true }
**< HTTP/1.1 201 Created**
Location: http://www.sample.org/api/projection/123 (absolute url)
-- Request of a projection
**> GET /resourcex/999/projection/123 HTTP/1.1**
答案 0 :(得分:2)
我个人更喜欢查询字符串,因为它是相同的资源,对吗?
在文档中写一下,资源可以通过网址http://example.com/resource/<id>
访问,并且它有一个可选参数size
,默认设置为“预览”。
http://example.com/resource/X # implies the query-parameter "size=preview"
http://example.com/resource/X?size=preview
http://example.com/resource/X?size=original
其他东西不在我的眼里,因为目的是使用一个URI访问一个资源。在这种情况下,您正在访问相同的资源,但要求获取它的修改版本,在这种情况下,以不同的大小。这是我个人将作为查询参数放入的内容。
答案 1 :(得分:0)
我建议将您的资源划分为多个子资源。
如果有巨大数量的数据并且您只想要其中一些数据,那么您可以将API设计为仅提取这样的数据:
GET /resources/999/name
GET /resources/999/price
这两个查询可能比GET /resources/999
的完整表示要轻得多。
最大优势之一就是您可以重复这些URI与其他操作,例如POST /resources/999/price
来更改价格,而不是使用{{ 1}}。它还可以简化您的缓存清算策略,以便在您更改价格时,只会使PATCH /resources/999
和/resources/999
无效,同时保持所有/resources/999/price
条目的完整。
如果投影 提前知道,您可以创建特定的媒体类型,例如:
/resources/999/*
此方法的优点是您可以减少请求数量以获取许多属性而无需全部获取它们。
您还可以创建一个API来创建可重用的媒体类型(“投影”),但由于媒体类型通常定义了服务器和客户端之间的某种契约,因此这可能是一种冒险的方法。