使用Restful HTTP API一次创建两个资源

时间:2012-06-17 13:33:30

标签: http rest

我正在为我的应用程序设计一个restful HTTP API。

该应用包含具有产品的类别。

我希望用户能够在一个类别中创建产品,如果该类别不存在,那么它将自动创建。因此,没有用于单独创建类别的API(因为我不希望人们在没有任何产品的情况下创建类别)。

我不太明白我应该如何为此设计API。通常的方式是:

1. Create a category:
   POST /categories {"name": "Movies"}
2. Use the new category's id to create a product:
   POST /categories/:id/products {"name": "The Matrix"}

由于我不想向用户公开第一个,我应该如何让他们直接创建产品?

3 个答案:

答案 0 :(得分:4)

产品应该不是类别的从属资源。只需使用其所属的类别列表创建新产品,然后使用/ categories资源浏览类别。当新类别出现在产品的类别列表中时,会添加新类别作为副作用。

1. Create product:
PUT /product/the_matrix {"name":"The Matrix","category_list":["movies","science fiction"]}

2. Browse categories:
GET /categories

答案 1 :(得分:2)

看起来你被困在RMM的第2级。在级别3中,超媒体控件允许您定义与资源的有效交互。例如

GET / HTTP/1.1

可能会回复

HTTP/1.1 200 OK
<catalogue href="/">
    <products href="/products"/>
    <categories href="/categories"/>
</catalogue>

然后,您可以关注products链接

GET /products HTTP/1.1

可能会以

回复
HTTP/1.1 200 OK

<products href="/products">
    ...
    <create href="/products" method="post">
        <input name="name" type="string" cardinality="required"/>
        <input name="category" type="string" cardinality="required"/>
    </create>
</products>

然后你可以create新产品如下

POST /products HTTP/1.1
Content-Type: application/x-www-form-urlencoded

name=The+Matrix&category=Movies

如果服务器收到电影,则会创建电影category(如果不存在),然后将电影product添加到电影category。同时,在初始响应中跟随categories链接可能会提供搜索和浏览类别的机制,但它不会包含create表单,因为您的业务规则不允许用户创建空类别

有关详细信息,请参阅REST in Practice

答案 2 :(得分:0)

是的,您可以让他们直接创建产品

  

我希望用户能够在一个类别中创建产品,如果该类别不存在,那么它将自动创建。因此,没有用于单独创建类别的API(因为我不希望人们在没有任何产品的情况下创建类别)。

因此,没有明确创建类别的可能性。但是你需要一些id才能在其中创建产品。我建议你按照解决方案。

您需要一些类别ID。在某种程度上,客户应该了解类别。因此,您可以选择获取类别列表。

GET /categories 

无论如何,如果没有类别列表,您可以将URL公开给用户以创建产品:

POST /categories/{catIdOrName}/products

在此操作中,您应检查{catIdOrName}是否存在,如果没有,则在其中创建它和产品。但实际上,类别创造还不清楚。但这样的行为可能是。

我看到更好的方式:

  1. 获取类别列表的操作。
  2. 在Product对象中 - 属性/具有类别的字段。无论如何,你应该在Category-Product,
  3. 之间建立联系
  4. 在类别对象字段/属性“bool isNew”
  5. 当用户将产品创建为新类别时,isNew将为true,并且在URL中将使用特殊ID作为新类别或“新”字符串ID。

    POST / categories / new / products

  6. 当有请求时,会出现已存在但已标记为新的类别。比返回409冲突。

  7. 当产品进入现有的ctaegory时,将使用URI中的真实类别ID。

    POST / categories / sport / products

  8. 或者作为替代方案,使类别和产品独立于URI。并且仅通过POST /产品创建产品,其中设置了Product对象类别,并且在执行时将根据需要创建它。在类别资源上,它只能通过GET获取类别列表。