这会被认为是糟糕的RESTFul设计吗?

时间:2017-07-02 18:39:59

标签: java spring rest query-parameters path-parameter

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

  1. 获取所有产品。
  2. 按ID获取产品。
  3. 现在,我所做的是,我为此制作了一个API,

    @Path("/products")
    public interface ProductResource {
    
        @GET
        @ApiOperation(value = "Gets all the products by criteria")
        Response getProductsByCriteria(@Context UriInfo uriInfo);
    }
    

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

    我只是想知道,这是一个糟糕的RESTFul设计吗?我是否应该使用两个单独的API来获取基于其ID的产品以及获取所有产品?

3 个答案:

答案 0 :(得分:2)

我建议使用单独的端点:

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

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

答案 1 :(得分:2)

你一定有

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

通过这种方式,它更容易阅读,并且与您在互联网上找到的其他优质API一致。

答案 2 :(得分:1)

通过混合getAll和getById,您忽略了一个重点:API的调用者无法知道productId是否存在。 通常情况下,如果产品ID不存在,您将在get上返回404。

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