2017-07-02 75 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一致。