NET Core中HttpGet使用FilterDTO参数实现列表过滤的相关问题咨询
问题1解答
ASP.NET Core的参数绑定默认规则是:简单类型(比如int?、string这类基础类型)默认从查询字符串、路由数据中读取值;而自定义类这类复杂类型,默认从请求Body中读取JSON格式的数据。
你发起的是GET请求,本身没有携带请求Body,所以框架尝试解析Body里的JSON时找不到内容,就抛出了你看到的400错误。而你把参数改成int? makeId时,框架直接从查询字符串里取到了对应值,所以能正常运行。
问题2解答
不需要更换HTTP谓词。
你的需求是查询车辆列表资源,完全符合GET请求的语义(GET专门用于读取/获取资源,支持缓存、书签等标准HTTP特性)。如果换成POST等其他谓词反而不符合REST接口设计规范,也会丢失GET请求自带的各类优势。
问题3解答
可以实现,只需要给你的复杂类型参数加上[FromQuery]特性即可,明确告诉框架从查询字符串中绑定这个DTO的所有属性:
[HttpGet] public async Task<IEnumerable<VehicleDTO>> Get([FromQuery] FilterDTO filterDto) { // 原有逻辑保持不变 var filter = _mapper.Map<Filter>(filterDto); var vehicles = await _vehicleRepository.GetAll(filter); return _mapper.Map<IEnumerable<VehicleDTO>>(vehicles); }
后续新增customerId等其他过滤条件时,只需要在FilterDTO类中添加对应的属性即可,请求时在URL的查询字符串里带上对应的参数(比如?makeId=2&customerId=123),框架会自动把值绑定到filterDto的对应属性上,不需要修改接口逻辑,也不需要调整请求谓词。
内容的提问来源于stack exchange,提问作者Random Stranger
相关产品推荐
相关产品推荐

