Java RESTAPI:关于使用单独端点或添加RequestParam的建议

Java RESTAPI:关于使用单独端点或添加RequestParam的建议,java,rest,api,Java,Rest,Api,我们在Spring中开发了一个JavaWeb应用程序,它使用RESTAPI为一个简单的留言板建模,目前我面临一个问题 我有几个端点返回我的onject的几个json表示。 Es: 我还有一个BaseController,用于基本CRUD操作;我的所有其他控制器扩展此BaseController 然后,我添加了一些用于搜索讨论的过滤器,并添加了一个端点讨论/search;端点以RequestParams的形式接受多个可选参数,这是控制器方法签名: @ResponseBody @RequestMap

我们在Spring中开发了一个JavaWeb应用程序,它使用RESTAPI为一个简单的留言板建模,目前我面临一个问题

我有几个端点返回我的onject的几个json表示。 Es:

我还有一个
BaseController
,用于基本CRUD操作;我的所有其他控制器扩展此
BaseController

然后,我添加了一些用于搜索讨论的过滤器,并添加了一个端点
讨论/search
;端点以
RequestParams
的形式接受多个可选参数,这是控制器方法签名:

@ResponseBody
@RequestMapping(value="/search",method=RequestMethod.GET)
public List<Discussions> findDiscussioniForumEPT(@RequestParam (value = "idSection", required=false) String idSection,
                                                             @RequestParam(value="competenzeArray", required=false) String[] parametersArray,
                                                             @RequestParam(value="flUnreadDiscussions", required=false) boolean flUnreadDiscussions,
                                                             @RequestParam(value="flIncludeArchivedDiscussions", required=false) boolean flIncludeArchivedDiscussions)
但这将迫使我在另一个端点上添加几乎所有已经存在的参数
project/api/discussions/search

另一方面,我可以在搜索端点上添加另一个参数来覆盖这种情况,从而增加过滤器的复杂性

有更好的设计方法吗?

纯IMHO: 一般来说,答案有两个不同的方面:

1.语义: 只要新案例的功能仍然是“搜索”,但“仅存档”,从语义上讲,使用“仅存档”作为另一个参数(例如布尔真/假)更有意义

2.现有应用程序架构:

a.如果您拥有solid monolith应用程序,并且无意为每个不同的端点(或其子集)运行单独的(微型)服务应用程序集

然后添加另一个参数,而不是另一个端点,从语义和UI代码的角度来看,这更有意义。只要所有其他案例都有相同的端点,我想管理它就更容易了,而不是添加更多的端点来处理

b.但如果不同的功能将作为单独的(微)服务运行,则新的端点更可取

比如说:

有一个服务应用程序运行“常规搜索”功能, 当另一个服务应用程序运行“仅存档搜索”功能时

在这种情况下,您必须有不同的端点,因为您不需要做任何事情来将请求路由到适当的端点。它发生在网络层面

但是,基于请求参数的路由请求需要额外的层,该层必须决定将请求传递到何处

像这样的事

注:但这种问题可能会引发一场长时间的讨论(基于每个人的意见),而据我所知,这不是本网站的目的……

纯粹的IMHO: 一般来说,答案有两个不同的方面:

1.语义: 只要新案例的功能仍然是“搜索”,但“仅存档”,从语义上讲,使用“仅存档”作为另一个参数(例如布尔真/假)更有意义

2.现有应用程序架构:

a.如果您拥有solid monolith应用程序,并且无意为每个不同的端点(或其子集)运行单独的(微型)服务应用程序集

然后添加另一个参数,而不是另一个端点,从语义和UI代码的角度来看,这更有意义。只要所有其他案例都有相同的端点,我想管理它就更容易了,而不是添加更多的端点来处理

b.但如果不同的功能将作为单独的(微)服务运行,则新的端点更可取

比如说:

有一个服务应用程序运行“常规搜索”功能, 当另一个服务应用程序运行“仅存档搜索”功能时

在这种情况下,您必须有不同的端点,因为您不需要做任何事情来将请求路由到适当的端点。它发生在网络层面

但是,基于请求参数的路由请求需要额外的层,该层必须决定将请求传递到何处

像这样的事


注:但这种问题可能会引发长时间的讨论(基于每个人的意见),而据我所知,这不是本网站的目的…

谢谢您的时间@Vadim。我的问题只是为了避免代码重复,而不是采用更为restful的方法;我还在学习休息,所以我有很多疑问。无论如何,我们目前没有任何微服务架构,只欢迎您使用一个单片后端-所以,不要担心,使用一个参数。这样做更有意义,代码重复更少。。。当(如果)你决定使用微服务时,你无论如何都需要重新审视和重组一切。。。附言我不是任何类型的休息迷…:-)感谢您抽出时间@Vadim。我的问题只是为了避免代码重复,而不是采用更为restful的方法;我还在学习休息,所以我有很多疑问。无论如何,我们目前没有任何微服务架构,只欢迎您使用一个单片后端-所以,不要担心,使用一个参数。这样做更有意义,代码重复更少。。。当(如果)你决定使用微服务时,你无论如何都需要重新审视和重组一切。。。附言我不是任何类型的休息迷…:-)
@ResponseBody
@RequestMapping(value="/search",method=RequestMethod.GET)
public List<Discussions> findDiscussioniForumEPT(@RequestParam (value = "idSection", required=false) String idSection,
                                                             @RequestParam(value="competenzeArray", required=false) String[] parametersArray,
                                                             @RequestParam(value="flUnreadDiscussions", required=false) boolean flUnreadDiscussions,
                                                             @RequestParam(value="flIncludeArchivedDiscussions", required=false) boolean flIncludeArchivedDiscussions)
project/api/discussions/archived