22

我是服务器端 Web 开发的新手,最近我阅读了很多关于实现 RESTful API 的内容。我仍然坚持的 REST API 的一个方面是如何构建 URI 层次结构,以识别客户端可以与之交互的资源。具体来说,我一直在决定层次结构的详细程度以及在资源由其他资源类型组成的情况下该怎么做。

这是一个例子,希望能说明我的意思。想象一下,我们有一个 Web 服务,可以让用户从其他用户那里购买产品。所以在这个简单的例子中,有两个顶级资源usersproducts。下面是我开始构建 URI 层次结构的方法,

对于用户:

/users
      /{id}
           /location
           /about
           /name
           /seller_rating
           /bought
           /sold

对于产品:

/products
         /{id}
              /name
              /category
              /description
              /keywords
              /buyer
              /seller

在这两种情况下,每个层次结构中的对象都引用另一个层次结构中对象的子集。例如/users/{id}/bought,某个用户已购买的产品列表,它是/products. 此外,/products/{id}/seller引用销售特定产品的用户。

由于这些 URI 引用其他对象或其他对象的子集,API 是否应该支持这样的事情:/users/{id}/bought/id/description/products/{id}/buyer/location?因为如果支持这些类型的 URI,有什么办法阻止这样的事情/users/{id}/bought/{id}/buyer/bought/{id}/seller/name,或者同样令人费解的事情?此外,在这种情况下,由于服务器中的路由器必须解释任意长度的 URI,您将如何处理路由?

4

2 回答 2

27

目标是构建方便的资源标识符,不要尝试交叉引用所有内容。您不必在 URL 表示中重复您的数据库关系 :)

像这样的链接/product/{id}/buyer永远不应该存在,因为该资源已经有了标识符:/user/{id}

尽管可以拥有,/product/{id}/buyers-list因为买家列表是产品的属性,在其他情况下不存在。

于 2013-03-08T23:26:05.957 回答
16

您应该以 CRUD 方式来考虑它,其中每个实体都支持 Create、Read、Update 和 Delete(通常分别使用 GET、POST、PUT 和 DELETE HTTP 动词)。

这意味着您的端点通常只会深入一层。例如

用户

GET    /users       - Return a list of all users (you may not want to make this publically available)
GET    /users/:id   - Return the user with that id
POST   /users      - Create a new user. Return a 201 Status Code and the newly created id (if you want)
PUT    /users/:id   - Update the user with that id
DELETE /users/:id  - Delete the user with that id

进入更多细节,例如/users/:id/about可能没有必要。虽然它可能会起作用,但它可能会变得有点过于具体。

也许在您的情况下,您可以添加:

GET    /users/:id/bought - Array of products that the user bought
GET    /users/:id/sold   - Array of products that the user sold

您可以在其中返回一个 id 列表(可以通过 products API 获取),或者如果您愿意,您可以在将它们发回之前填充产品。如果您确实选择填充它们,那么您可能不应该填充每个产品引用的用户。这将导致循环包含并且是错误的。

对于产品,在您的情况下,我会使用:

GET    /products- Return a list of all products
GET    /products/:id   - Return the products with that id
POST   /products- Create a new product. Return a 201 Status Code and the newly created id (if you want)
PUT    /products/:id   - Update the product with that id
DELETE /products/:id  - Delete the product with that id

GET    /products/:id/buyers     - Array of who bought the product
GET    /products/:id/sellers    - Array of everyone selling the product
于 2013-03-08T23:37:34.097 回答