我们正在对Products进行属性搜索,并创建一个搜索API。
API产品在其请求中具有属性,包括VendorId(销售产品的人(和LocationId(销售地点(。下面,是否最好将Vendor和LocationId设为一个数组,而不是单个数组?前端搜索只允许单选下拉菜单。然而,在未来需求的情况下,API后端的最佳实践是什么?我不想把后端和前端连在一起。
public class GetProductRequest {
private String productSearchString;
private Integer locationId;
private Integer providerId;
private String sortField = "ProductName,desc";
private int pageNumber = 0;
private int pageSize = 10;
}
SQL查询:
select distinct product.*
from dbo.productContract
left join dbo.product
on productContract.productId = product.productId
left join dbo.vendor
on productContract.vendorId = vendor.vendorid
left join dbo.location
on productContract.locationId = location.locationId
where productContract.vendorId in (@vendorIds) and productContract.LocationId in (@LocationIds)
后端的唯一变化是将where ==
转换为where in
以进行多重转换。
这取决于情况。
RESTapi是关于资源的,因此拥有像这样的端点是无稽之谈
.../api/v1/product
即接受多个适用的搜索条件字段值,因为它将返回什么-数组?第一个有效?
想想看,用户发送一个元素数组是多么奇怪,因为API需要它
当你有时的另一个故事
.../api/v1/products
那么多个搜索条件是完全可以和预期的。
在我看来,您应该提供两个端点,并且每个端点都应该有另一个请求有效负载-如果是单一资源,那么对于资源列表,搜索条件字段应该绝对是单一的-好吧,在我看来您可以接受描述有效产品的请求列表。
[
{
productName:"sneakers",
locationId:"US",
providerId:"Nike",
...
},
// ... OR
{
productName:"sneakers",
locationId:"US",
providerId:"Adidas",
...
},
...
]
另外,请记住YAGNI规则。不执行总的、最终的、";我再也不会看这个了"后端REST API:(