我的网络服务是否符合RESTful标准?

4
我有一个REST web服务,其中包含2个方法:
  1. [POST方法] 客户端将以XML的形式提供对象列表。我的web服务方法将根据对象中的一个属性[mode = insert/update]插入/更新对象列表,并返回一个XML,其中包含对象列表及其状态[插入/更新是否成功]。
  2. [POST方法] 它将接受一个objectId列表,并以XML的形式从服务器返回这些对象的状态。
我知道我们应该使用:
  • GET方法来检索信息
  • POST方法来创建新条目
  • PUT方法用于更新现有条目。
我知道我们的实现违反了一些REST约束,但是我们的需求迫使我们以这种方式实现它。
我的问题是- 改变约束以适应我们的需求是否可以?
3个回答

5
你试图做的事情可以通过RESTful实现。虽然POST通常用于将单个实体添加到集合中,但它也可以用于提交数据块到“数据处理资源”。这基本上为使用POST开展任何您想要的业务打开了大门。
人们经常误解REST约束,并认为必须使用PUT和DELETE才能符合RESTful要求。这不是事实。没有使用所有方法的要求,唯一的要求是不要误用您使用的方法。
显然,如果您将单个实体POST到集合中以创建实体,对API用户更具直观性。但是,如果这对您来说不可行,则可以自由定义一个新的媒体类型,其中可以包含要由某些数据处理资源创建/更新的对象集合。
重要的是要明确这些规则。您应该创建一个新的媒体类型,如application/vnd.yourcompany.objectlist+xml,并需要撰写有关如何构建该媒体类型的文档。
既然您已经定义了媒体类型,您的客户端需要知道在哪里POST对象列表。理想情况下,您可以定义一个新的链接关系(例如objectprocessor),可以在其他文档中使用链接关系提供POST URL。在该链接关系的规范文档中,您应向客户端开发人员解释,当您将application/vnd.yourcompany.objectlist+xml发布到具有链接关系objectprocessor的链接时,将发生x、y和z。
假设您的根URL返回某种XHTML文档,如下所示:
<html>
  <h1>My awesomely restful service that can create objects in batches</h1>
  <link rel='objectprocessor' href='http:/example.org/myservice/objectprocessor'/>
</html>

一个客户端应用程序可以处理这个文档,发现这个链接并根据链接关系定义理解需要将 application/vnd.yourcompany.objectlist+xml POST 到 href 中指定的终端点。

通过这种方式,消息是完全自描述的,您正在与可发现的 URL 标识的资源交互,并且您遵守统一接口的规则。


1

这个 Web 服务不是 RESTful 的。你总是可以打破限制,但你会失去 REST 标签 :-)


1

打破规则的问题在于使用您的 Web 服务的客户可能会假设某些可能不适用的事情。一般来说,如果您拥有客户端和服务,则这并不是一个大问题,但对于公共 Web 服务,您可能需要考虑更好地遵循 REST 原则。


谢谢您的快速回复。我如何以RESTful方式实现第一种方法?其中一种方法是为每个对象[客户端不需要的]进行<saveObject>调用。我们是否有办法以RESTful方式处理多个插入/更新? - Fadd
@Surjit:你可能想看看Darrel的回答 - Daniel Vassallo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接