【问题标题】:Create two resources at once using Restful HTTP API使用 Restful HTTP API 一次创建两个资源
【发布时间】:2012-06-19 18:18:35
【问题描述】:

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

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

【问题讨论】:

  • 是否可以删除产品,或从类别中删除产品?如果是这样,如果从一个类别中删除所有产品会发生什么?在我看来@stinkymatt 的反应更好,因为类别列表似乎是一个计算资源,而不是你直接编辑的东西。
  • 如果其中的所有产品都被删除,我考虑删除一个类别。当有人通过 DELETE /products/:id 删除某些内容时,我可以添加一个额外的逻辑,该逻辑在删除后检查类别是否为空。如果是这样,我将其删除。不直接处理类别:)

标签: http rest


【解决方案1】:

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

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

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

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

GET /categories 

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

POST /categories/{catIdOrName}/products

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

更好的观察方式:

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

    发布/类别/新/产品

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

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

    发布/类别/运动/产品

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的,这似乎很合适。类别只是所创建产品的“标签”。顺便提一句。我们不能使用 POST /products 来代替吗?我发现它更好,而不是用户必须担心正确的 :id 使用
    • 是的,这是对 POST 的完美使用。我很高兴。
    • 我也有类似的问题,这验证了我的想法。我唯一想知道的是响应实际上会是什么样子?对于 POST,您希望使用 Location 标头响应 201 Created。您如何通知已创建侧资源?额外的位置标题?
    【解决方案3】:

    您似乎被困在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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-25
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多