0

我第一次在 Spring 中设计 API,我有以下用例:

  1. 获取所有产品。
  2. 按 ID 获取产品。

现在,我所做的是,我为此制作了一个 API,

@Path("/products")
public interface ProductResource {

    @GET
    @ApiOperation(value = "Gets all the products by criteria")
    Response getProductsByCriteria(@Context UriInfo uriInfo);
}

我正在做的是,我在查询参数中获取 ID。如果它的值为空,我将调用该方法(在服务层)返回所有产品,否则我将调用该方法返回基于其 id 的特定产品(进入查询参数)。

我只想知道,这是一个糟糕的 RESTFul 设计吗?我是否应该使用两个单独的 API 来根据他们的 ID 获取产品并获取所有产品?

4

3 回答 3

2

我建议有单独的端点:

  • GET /products适用于所有产品
  • GET /products/{productId}用于通过特定 id 获取产品,该 id 将作为PathParam. 通过这种方式,您可以拥有其他端点来操作产品数据,例如PUT /products/{productId}DELETE /products/{productId}. NOT FOUND (404)如果未找到产品,它们将返回 HTTP 状态。

QueryParam更适合按某些特性过滤产品,例如GET /products?color=red.

于 2017-07-02T18:50:29.330 回答
2

你绝对应该有

  • GET /products- 返回所有产品的列表
  • GET /products/:id- 如果找不到产品,则返回单个产品或 404

通过这种方式,它更易于阅读,并且与您在 Internet 上找到的其他质量 API 一致。

于 2017-07-02T18:56:41.353 回答
1

通过混合 getAll 和 getById,您遗漏了重要的一点:API 的调用者无法知道 productId 是否存在。通常,您会在获取不存在的产品 ID 时返回 404。

所以回答你的问题:是的,这是一个 Restful 设计错误。

于 2017-07-02T18:46:37.417 回答