2017-07-02 73 views
0

我正在设计的API在春天的第一时间,我有以下的用例:这会被认为是不好的RESTFul设计吗?

  1. 获取所有的产品。
  2. 通过ID获取产品。现在

,我所做的就是,我给这个单一的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

'我是否应该有两个独立的API来获取基于ID的产品并获取所有产品?'绝对是的,你应该。这样,你的服务将会更加紧密,并且让任何看着你的代码的人都能更容易理解它。 –

回答

1

通过混合getAll和getById,您会错过一个重要的观点:API的调用者无法知道productId是否存在。 通常情况下,您将返回一个404,以获取不存在的产品ID。

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

2

我会建议有单独的端点:

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

QueryParam是更适合的一些特性来过滤产物,例如GET /products?color=red

2

你绝对应该有

  • GET /products - 回报所有产品
  • GET /products/:id列表 - 返回单一产品或404的情况下,该产品未发现

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