用于过滤资源的 REST API 调用

nav*_*yad 4 rest

我正在构建一个 REST API,我有一个资源说电影。

1) POST : movies/

2). GET : movies/{movie_id}
Run Code Online (Sandbox Code Playgroud)

调用 1) 创建一个帖子。

调用 2) 当提供 movie_id 时,它返回特定电影的详细信息,否则返回所有电影。

现在我必须根据电影属性(如受欢迎程度、评级等)过滤掉电影

我的疑问是:

是否应该有单独的 URL 来过滤电影,例如

GET: movies/filter/
Run Code Online (Sandbox Code Playgroud)

此调用将具有 GET 参数,例如 popuplar、 rating 等,并且可以根据这些参数过滤掉电影。

不确定处理这种情况的标准方法是什么,请分享您对此的看法,

dei*_*tch 6

在这种情况下,我已经看到了两种基本方法。一种是您建议的,即使用单独的 URLmovies/filter/并将其过滤掉。经典的例子是cars/colors/red/maker/porsche

另一种是使用查询参数,如果可能,这是我的首选方法。

GET /movies?year=2010&actor=Carrey
Run Code Online (Sandbox Code Playgroud)

变体可以包含每个变体的倍数(当然,URL 编码适当)

GET /movies?year=[2010,2011]&actor=Carrey
Run Code Online (Sandbox Code Playgroud)

我喜欢这种方法,因为它清楚地说:“获取电影列表,但受这些属性的限制”。

我见过并有时在必要时使用的两种变体是尝试将查询参数中的实际搜索词与其他提交分开。当您需要将查询参数用于搜索以外的事情时,通常会出现这些。

第一个是混合,它说,“在特定的子路径中,只搜索并将查询参数视为搜索词。所以像:

GET /movies/filter?year=2010&actor=Carrey
Run Code Online (Sandbox Code Playgroud)

或者如果你喜欢

GET /movies/search?year=2010&actor=Carrey
Run Code Online (Sandbox Code Playgroud)

一个变体是标记任何搜索词

GET /movies?search.year=2010&search.actor=Carrey
Run Code Online (Sandbox Code Playgroud)

最后,我不太喜欢的一个变体是有一个/search路径

GET /search/movies?year=2010&actor=Carrey
Run Code Online (Sandbox Code Playgroud)

有时它是必要的,但我不喜欢它,因为它search是一个action,而不是一个resource,因此不是非常 RESTful 的路径。但其他人可能喜欢它。