4

我正在为我的应用程序设计一个宁静的 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"}

既然我不想把第一个暴露给用户,我应该如何让他们直接创建产品呢?

4

3 回答 3

4

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

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

2. Browse categories:
GET /categories
于 2012-06-17T14:07:46.877 回答
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

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

有关更多详细信息,请参阅实践中的 REST

于 2012-06-17T14:15:02.890 回答
0

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

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

因此,不可能明确地创建类别。但是您需要一些 id 才能在其中创建产品。我建议您遵循解决方案。

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

GET /categories 

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

POST /categories/{catIdOrName}/products

在此操作中,您应该检查 {catIdOrName} 是否存在,如果不存在,则在其中创建它和产品。但说真的,类别创建并不清楚。但这样的行为可能是。

我看到的更好的方式:

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

    发布/类别/新/产品

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

  6. 当产品涉及现有类别时,将使用 URI 中的真实类别 ID。

    发布/类别/运动/产品

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

于 2012-06-17T14:05:21.507 回答