Json RESTFul管理巨大的资源、表示和投影

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/

我需要在我的RESTFul设计中管理非常大的元素。 我试图应用“divide et impera”方法,我可以吐出这些元素,但结果是最小的元素,但它们仍然太大

  • 所以我有两个选择,我想问问你们对这件事的看法
关于“表示”,我可以使用不同的URI来管理它们。 如。 /api/resourcex/用于资源x的最小表示形式 /api/resourcex_big/用于资源x的大型表示 /api/resourcex\u full/用于整个资源x

其他

我可以使用分层方法 /api/resourcex/ /api/resourcex/big /api/resourcex/full

你认为什么是语义正确的?我选择第一个是因为我想保留资源“子元素”的层次关系

例如,我想对resourcesx的列表使用Eg./api/resourcex/,然后使用resourcex_big/{id}作为从资源的列表链接的表示,作为目标细节。然后将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**
——创建投影
**>POST/projection/HTTP/1.1**
{resource:“resourcex”,“name”:true,“price”:true}
**GET/resourcex/999/projection/123 HTTP/1.1**

我个人更喜欢查询字符串,因为它是相同的资源,对吗

在文档中写下,URL
http://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访问修改版本中的资源。但我认为这取决于你的看法:)