我正在Spring中第一次设计API,我有以下用例:
现在,我所做的是,我为此制作了一个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的产品以及获取所有产品?
答案 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。
所以回答你的问题:是的,这是一个宁静的设计错误。