问题: 设计具有可选参数和某些参数的不同业务逻辑的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或类似的东西来识别特定的房屋(资源)并不重要。按标准过滤现有房屋非常重要。
但是,在过滤时,必须确保某些参数存在不同的业务逻辑。
如何在后端优雅地映射这样的问题?有没有支持这种方法的模式?
答案 0 :(得分:1)
过滤可能很难做到正确,所以这里没有正确或错误的答案。这是我如何处理这个问题的方法。
首先,我们假设您有一个RESTful URL;
/rest/v1/search-houses/
其中可以包含多个参数,一个或多个参数。
基于此,您可以看到需要过滤的参数。这是您的业务逻辑所在的位置,这在很大程度上取决于您的代码库,数据库等的结构。
在设计模式方面,我认为MVC解决了很多问题。在这种情况下,如果您始终使用基本查找(即where town = London or country = UK
)从单个表中过滤数据,那么这很容易。只需使用已输入的参数构建String
,即where
子句部分。尽管使用prepared statements
,请确保安全地执行此操作。
如果您在多个表或不同的地方查找,具体取决于输入的信息,这会变得更加棘手。因此,在这种情况下,我可能希望创建多个模型文件,这些文件遵循上面概述的相同方法,但是针对特定数据库查询进行了定制。
希望能帮助您朝着正确的方向前进。遗憾的是,这个问题没有一个答案。与许多事情一样,这取决于......