Webservice具有可选参数和不同的业务逻辑

时间:2017-11-20 15:16:57

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

问题: 设计具有可选参数和某些参数的不同业务逻辑的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

在这种情况下,我必须决定哪些地理信息具有优先权。坐标或Street + City + ZipCode。

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

此外,无法获得无限半径的无限数量的搜索结果。因此,必须将两个值中的一个设置为有限数字才能触发搜索。

等等...进一步的逻辑...

结论

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

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

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

1 个答案:

答案 0 :(得分:1)

过滤可能很难做到正确,所以这里没有正确或错误的答案。这是我如何处理这个问题的方法。

首先,我们假设您有一个RESTful URL;

/rest/v1/search-houses/

其中可以包含多个参数,一个或多个参数。

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

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

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

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