进行RESTful API调用以更新许多相关实体

时间:2011-05-18 12:13:32

标签: rest restful-url

我们有一个看起来像这样的模型

Login <- Email Addresses <- Person -> Teen

一个存储过程,它从青少年中获取一些属性,一些来自人,一些来自Login,并创建一个新的青少年,返回一个人实体。

从经典的RPC角度来看,这很容易......只需公开方法InsertTeen并让它调用存储过程。

我一直试图围绕将URL作为我的资源(名词)的RESTful想法,并且唯一的行动是HTTP动作(动词)。显然,像/api/InsertTeen这样的网址根本不是RESTful。

但在这里我并没有处理任何特定的资源。

我唯一可以做的就是公开像insertTeenRequest这样的资源。

关于如何做到这一点还有其他想法吗?我是不是一个“狂热者”?

2 个答案:

答案 0 :(得分:2)

如果您想要真正的REST,那么在这种情况下您应该对API使用多个请求。例如,首先使用POST创建Teen到/ api / teens /,然后使用POST创建Person到/ api / persons /等等。

答案 1 :(得分:0)

我自己很熟悉REST,但我的想法是,在这里,您将使用“POST”与请求正文,其中包含创建“Teen”所需的数据,无论您使用何种格式,通常是JSON或XML 。在这里,我不确定您是否将青少年视为具有其他属性的人,或者将青少年建模为实体本身:

<person login="abc" email="abc@foo.com">
   <person-property-1>value1</person-property-1>
   <person-property-2>value2</person-property-2>
   <teen>
      <teen-property-1>value3</teen-property-1>
      <teen-property-2>value4</teen-property-2>
   </teen>
</person>

<teen login="abc" email="abc@foo.com">
   <person-property-1>value1</person-property-1>
   <person-property-2>value2</person-property-2>
   <teen-property-1>value3</teen-property-1>
   <teen-property-2>value4</teen-property-2>
</teen>

关于URI,我认为这些段应该是名词而不是动词,因为URI应该用来处理资源,所以/api/teens而不是/api/InsertTeen

带有HTTP GET的

/api/teens会返回所有青少年的列表,带有HTTP POST的/api/teens会插入一个新的青少年。为了完善CRUD操作,/api/teens/{id}使用HTTP GET将返回特定的Teen,/api/teens/{id}使用HTTP PUT将使用请求正文中传递的值更新Teen,并调用/api/teens/{id}使用HTTP DELETE将删除指定的Teen。

修改

再次阅读你的问题,我可能会误解。如果您不是将“青少年”视为资源,而只是“人”,那么我会考虑使用HTTP POST /api/people,并根据请求正文中传递的值,做适当的事情。存储那个'人'。因此,如果请求包含“青少年”值,请调用创建“青少年”的存储过程并返回“人物”。

HTH