Json RESTFul管理巨大的资源、表示和投影
我需要在我的RESTFul设计中管理非常大的元素。 我试图应用“divide et impera”方法,我可以吐出这些元素,但结果是最小的元素,但它们仍然太大Json RESTFul管理巨大的资源、表示和投影,json,api,http,rest,language-agnostic,Json,Api,Http,Rest,Language Agnostic,我需要在我的RESTFul设计中管理非常大的元素。 我试图应用“divide et impera”方法,我可以吐出这些元素,但结果是最小的元素,但它们仍然太大 所以我有两个选择,我想问问你们对这件事的看法 关于“表示”,我可以使用不同的URI来管理它们。 如。 /api/resourcex/用于资源x的最小表示形式 /api/resourcex_big/用于资源x的大型表示 /api/resourcex\u full/用于整个资源x 其他 我可以使用分层方法 /api/resourcex/
- 所以我有两个选择,我想问问你们对这件事的看法
-- 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**
——创建投影
**>POST/projection/HTTP/1.1**
{resource:“resourcex”,“name”:true,“price”:true}
**GET/resourcex/999/projection/123 HTTP/1.1**
我个人更喜欢查询字符串,因为它是相同的资源,对吗
在文档中写下,URLhttp://example.com/resource/
并且它有一个可选参数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访问一个资源。在本例中,您正在访问同一个资源,但要求取回它的修改版本,在本例中,是不同大小的。我个人会把它作为一个查询参数。我建议将您的资源划分为多个子资源 如果有大量的数据,而您只需要其中的一部分,那么您可以将API设计为只获取以下内容:
GET /resources/999/name
GET /resources/999/price
这两个查询可能比完整表示的GET/resources/999
要轻得多
它的一大优点是,您可以将这些URI与其他操作一起重用,例如POST/resources/999/price
来更改价格,而不是使用PATCH/resources/999
。它还可以简化缓存清除策略,这样当您更改价格时,您只会使/resources/999
和/resources/999/price
无效,同时保持所有/resources/999/*
条目不变
如果您的投影是预先知道的,您可以创建特定的媒体类型,例如:
GET /resources/999
Accept: application/vnd.yourcompany.resourcetype+json
# Receiving full representation of /resources/999
GET /resources/999
Accept: application/vnd.yourcompany.resourcetype.light+json
# Receiving light representation of /resources/999
GET /resources/999
Accept: application/vnd.yourcompany.resourcetype.name_price+json
# Receiving "name" and "price" from /resources/999
此方法的优点是,您可以减少请求的数量以获取多个属性,而无需获取所有属性
您还可以创建一个API来创建可重用的媒体类型(“投影”),但由于媒体类型通常定义服务器和客户端之间的某种契约,这可能是一种危险的方法。据我所知,我们可以在同一资源中使用不同的URI点作为别名。据我所知,我认为我们可以使用资源的表示,这些表示是我们想要公开的资源的抽象。也许我错了,但这些是这些URI设计的基本思想(第一节关于单个资源的不同表示)。感谢您的回答:)也就是说,您还可以将预览图像视为原始资源的修改版本,但在本例中,我将在调用
http://example.com/resource/
。这也是location头中返回的资源,即使您可以使用不同的URI访问修改版本中的资源。但我认为这取决于你的看法:)