前端
Axios的GET请求
1.GET无法使用data传参,得使用params
http.get<PageResult<LoginLogVo>, PageParamDto<LoginLogDto>>({
url: '/sys/v1/list',
// data 无法传参
// data: pageParamDto,
params: pageParamDto
})
2.params属性值为多个对象时
interface PageParamDto<T> {
pageParam: PageParam
dto?: T
}
params属性都为多个对象时,默认序列化为:
pageParam[currentPage]=2&pageParam[pageSize]=5&dto[userId]=10001&dto[location]=北京
后端无法解析这种格式对象
解决方案:使用 qs 序列化params参数
pageParam.currentPage=2&pageParam.pageSize=5&dto.userId=10001&dto.location=北京
import qs from 'qs'
// params序列化
paramsSerializer: (params) => {
return qs.stringify(params, { indices: false, allowDots: true, arrayFormat: 'repeat' })
}
// AxiosRequestConfig 中 paramsSerializer属性
export interface AxiosRequestConfig<D = any> {
url?: string;
method?: Method | string;
baseURL?: string;
params?: any;
paramsSerializer?: ParamsSerializerOptions | CustomParamsSerializer;
...
}
qs更多使用方法: https://github.com/ljharb/qs
后端
SpringBoot3中Controller的GET方法
1.方法使用两个对象接收参数时
@Operation(summary = "分页列表")
@GetMapping
public ApiResult<PageResult<LoginLogVO>> list(PageParam pageParam, LoginLogDTO dto, HttpServletRequest request) {
return ApiResult.data(loginLogService.list(pageParam, dto));
}
GET参数为下列示例;可自动装配属性, 当两个对象中有相同字段时,值会发生混淆
currentPage=2&pageSize=5&userId=10001&location=北京
GET参数为下列示例;无法自动装配属性
pageParam.currentPage=2&pageParam.pageSize=5&dto.userId=10001&dto.location=北京
解决方法: 使用@InitBinder(“pageParam”)和@ModelAttribute(“pageParam”)指定参数前缀
@InitBinder("pageParam")
public void init1(WebDataBinder binder) {
binder.setFieldDefaultPrefix("pageParam.");
}
@InitBinder("dto")
public void init2(WebDataBinder binder) {
binder.setFieldDefaultPrefix("dto.");
}
@Operation(summary = "分页列表")
@GetMapping
public ApiResult<PageResult<LoginLogVO>> list(@ModelAttribute("pageParam") PageParam pageParam,@ModelAttribute("dto") LoginLogDTO dto, HttpServletRequest request) {
return ApiResult.data(loginLogService.list(pageParam, dto));
}
参考:https://www.hangge.com/blog/cache/detail_2483.html