RESTful发布许多实体的策略

时间:2009-05-31 14:45:05

标签: rest post uploading

我仍然处于以REST方式做事的过程中。

在我看来,客户端软件将与RESTful服务进行交互。很少,客户端将上传其整个实体数据库(每个实体序列化为大约5kb的xml块)。

也许我错了,但正确的RESTful策略似乎是循环每个实体并单独POST每个实体。然而,可能有成千上万的这些实体,并且不知何故,如此多的快速发布的POST似乎并不犹豫不决。

在这种情况下,将所有实体打包成一个大的xml表示会违反RESTful的处理方式,但它也可以避免需要数千个POST。

是否有一些标准练习来实现这一目标?提前谢谢!

4 个答案:

答案 0 :(得分:4)

我不明白为什么“实体包”不能被视为资源。事务性写入当然可以将数据库事务视为资源。我承认我没有读过Fielding的论文,但是我没有看到如何将多个资源包装到单个表示中会使REST无效。

数据库事务做这样的事情。它们将在事务资源中包装较小的资源。通常他们这样做是为了让你可以分别发布那些仍然很大的小资源。但是,由于事务本身被认为是一种资源,我不相信它会为你提供一个表示,你可以发布一个POST请求会使这个设计更少RESTful。

它也用于另一个方向。当客户端从服务器获取搜索结果时,服务器可能会将这些结果包装在结果资源中,以便客户端可以只获取这一个资源而不是几个单独的资源。

所以我要说在较大的集合资源中包装这些小的5kb资源可以被认为是RESTful,可能就是你应该采用的方式。

答案 1 :(得分:1)

只要大包装器具有有效的媒体类型,就可以将其视为单个资源。弄清楚媒体类型将是什么是棘手的部分。

答案 2 :(得分:1)

这里至少有两个问题阻止你成为RESTful。

  1. 每个资源都需要通过URI进行标识。对资源执行操作意味着您必须使用HTTP调用来调用URI。因此,您无法在一次HTTP调用中调用多个资源中的多个操作。

  2. 资源由名词识别并代表实体。这意味着要插入员工和汽车,您需要为每个相应的实体调用两个不同的资源。

  3. 总而言之,你不能在这里采用纯粹的RESTful方法。但是,REST旨在通过约定来帮助,而不是限制您。这里最好的解决方案是创建一个自定义操作,以满足您的需求。

    或者,您可以使用INSERT,UPDATE和其他操作创建一个通用包装器实体,这些操作将不同数据的blob作为XML接收。但是,这会破坏您的其他端点,因为现在可以通过通用包装器和/Car/ URI插入Car记录。

    在不了解您的实际要求的情况下,我建议您不要通过REST专门公开此功能。在幕后,如果在不同的对象中分解传入的集合,您仍然可以在各种控制器中调用INSERT操作方法。

答案 3 :(得分:0)

没有什么可以阻止你在添加时创建更多资源,也就是将一个X列表的资源发布到使用POST的X列表的资源。

然后,您将发回一个201,其中包含创建的所有资源的URIS列表。再一次,它完全是允许的。

您放弃的是PUT上中介的可见性,这阻止了它们在特定URI上缓存或修改特定资源。虽然智能中介会处理201用于缓存目的。

拥有一个并不会阻止你让每个创建的资源都有自己的URI后创建(在POST之后)并在这些资源上启用PUT / DELETE。或者是一个组合。