问题:设计具有可选参数和不同业务逻辑的Web服务的最佳方法是什么?
特定示例:
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
在这种情况下,我必须确定哪些地理信息优先。坐标或街道 城市 Zipcode。
为了使事情变得更加复杂,也应该可以将半径和搜索结果的数量传递给WebService。出于绩效原因,如果缺少该国,则不应获得无限数量的搜索结果。
此外,不可能获得无限数量的无限半径的搜索结果。因此,必须将两个值之一设置为有限数以触发搜索。
等等...进一步的逻辑...
结论:
通过ID或类似的东西识别特定房屋(资源)并不重要。按照标准过滤现有房屋很重要。
过滤时,必须确保某些参数有不同的业务逻辑。
如何在后端优雅地绘制这样的问题?是否有任何支持这种方法的模式?
过滤可能是一件很难的事情,因此这里没有正确或错误的答案。不过,这就是我的处理方式。
首先,假设您有一个宁静的URL;
/rest/v1/search-houses/
可以使用多个参数,一个或多个。
基于此,您可以查看需要过滤的哪些参数。这是您的业务逻辑所在的地方,这在很大程度上取决于您的代码库,数据库等的结构。
在设计模式方面,我认为MVC解决了很多问题。在这种情况下,如果您总是从一个具有基本查找的单个表中过滤数据,即where town = London or country = UK
,那么这很容易。只需使用已输入的参数来构建将存在where
子句部分的String
即可。确保使用prepared statements
安全地执行此操作。
如果您在多个表格或不同的位置上抬头,具体取决于输入了哪些信息,这会变得更加棘手。因此,在这种情况下,我可能希望创建多个遵循与上面概述相同方法的模型文件,但针对特定的数据库查询量身定制。
希望可以帮助您朝着正确的方向发展。不幸的是,这个问题没有一个答案。与许多事情一样,这取决于...