【问题标题】:Webservice with optional parameter and different business logic具有可选参数和不同业务逻辑的 Web 服务
【发布时间】:2018-05-03 20:43:13
【问题描述】:

问题: 设计具有可选参数和某些参数的不同业务逻辑的 Web 服务的最佳方法是什么?


具体例子:

该网络服务旨在使搜索房屋成为可能。

房屋资源的结构如下:

{
    "houseId": 3123,
    "street": "Drake Street",
    "houseNo": "789",
    "city": "London",
    "zipCode: "EC2R 6AB",
    "country": "uk",
    "coordinates": "51.506885, -0.128107",
    "inventory": ["Veranda", "Baloncy", "Stove"]
}

Web 服务应对给定地址或坐标执行邻近搜索,并返回满足给定条件的房屋。

有效示例:

/rest/v1/houses?city=London&street=Drake Street&inventory=Balcony&inventory=Veranda

现在还可以按如下方式发送请求:

/rest/v1/houses?city=London&street=Drake Street&coordinates=51.506885, -0.128107

在这种情况下,我必须决定哪些地理信息具有优先权。坐标或街道+城市+邮政编码。

为了让事情变得更复杂,还应该可以将半径和搜索结果的数量传递给 web 服务。出于性能原因,如果国家/地区缺失,则不可能获得无限数量的搜索结果。

此外,不可能在无限半径范围内获得无限数量的搜索结果。因此,必须将两个值之一设置为有限数才能触发搜索。

等等……进一步的逻辑……


结论:

通过 id 或类似的东西来识别特定的房子(资源)并不重要。按标准过滤现有房屋很重要。

但是,在过滤时,必须确保某些参数有不同的业务逻辑。

如何在后端优雅地映射这样的问题?是否有任何模式支持这种方法?

【问题讨论】:

  • 您可能收到的任何答案都主要基于意见,因此这个问题很适合被关闭。接下来,SO 这里有很多类似的问题,它们提供了不同方法的优缺点。最后但并非最不重要的一点是,您的服务(非常确定)无论如何都没有遵循 REST 原则,因此应该避免使用术语 REST

标签: java web-services optional-parameters business-logic


【解决方案1】:

过滤可能是一件很难做到的事情,因此这里没有正确或错误的答案。这是我将如何处理这个问题。

首先,假设您有一个 RESTful URL:

/rest/v1/search-houses/

它可以接受多个参数,一个或多个。

基于此,您可以查看需要过滤的参数。这是您的业务逻辑所在,这在很大程度上取决于您的代码库、数据库等的结构。

在设计模式方面,我认为 MVC 解决了很多问题。在这种情况下,如果您总是使用基本查找从单个表中过滤数据,即where town = London or country = UK,那么这很容易。只需使用已输入的参数来构建一个String,它将在where 子句部分出现。请确保使用prepared statements 安全地执行此操作。

如果您根据输入的信息在多个表或不同位置查找,这会变得更加棘手。因此,在这种情况下,我可能希望创建多个模型文件,这些文件遵循与上述相同的方法,但针对特定的数据库查询进行了定制。

希望这可以帮助您朝着正确的方向前进。不幸的是,这个问题没有单一的答案。与许多事情一样,这取决于...

【讨论】:

  • 嗨迈克尔,谢谢你的回答。我已经开发了一个接受各种参数的网络服务,根据参数执行业务逻辑,然后构造一个 SQL 语句(正如你已经描述的那样)。不幸的是,正在添加越来越多的参数和业务逻辑。因此维护webservice方法和过滤变得越来越复杂。根据业务逻辑对传入参数的验证以及用于db查询的结果搜索参数是最大的问题。
  • 是的,这些类型的事情很快就会变得非常混乱。我还没有找到一个完美的解决方案。我所做的最好的事情是将所有数据库查询放在单独的模型文件中,尽可能将事情分开,尽管根据个人要求,在某些情况下这可能会更糟。
  • un-RESTful URL 长什么样子?
猜你喜欢
  • 2011-06-25
  • 2010-12-24
  • 2012-01-13
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多