FeignClient传递超100个ID触发400 Bad Request问题求助
解决方案
1. 调整请求行长度限制(针对GET请求)
之前配置的max-http-header-size仅控制请求头,而URL过长属于请求行限制。如果用Tomcat作为容器,需添加以下配置:
server: tomcat: max-http-request-line-size: 100KB # 控制URL所在的请求行长度
2. 改用POST请求传递批量ID(推荐)
GET请求天生不适合传递大量参数,改为POST将ID列表放在请求体中彻底规避URL长度问题:
修改FeignClient:
@FeignClient( name = "${application.camera-service.service-id}", url = "${application.camera-service.url}" ) public interface FeignCameraServiceClient { @PostMapping("${application.camera-service.path}/batch") List<CameraResponse> getCameraList(@RequestBody List<Integer> idList); }
修改接收服务的方法:
@PostMapping("/cameras/batch") public ResponseEntity<List<CameraDTO>> getCamerasByIds(@RequestBody List<Integer> idList) { log.debug("REST request to get Cameras by IDs: {}", idList); CameraCriteria criteria = new CameraCriteria(); criteria.setIdIn(idList); List<CameraDTO> entityList = cameraQueryService.findByCriteria(criteria, Sort.by("id")); return ResponseEntity.ok().body(entityList); }
3. 优化Feign的参数传递方式
将@PathVariable改为@RequestParam,让Feign将列表参数编码为单个id.in=1,2,3...格式,减少URL长度:
@FeignClient( name = "${application.camera-service.service-id}", url = "${application.camera-service.url}" ) public interface FeignCameraServiceClient { @GetMapping("${application.camera-service.path}") List<CameraResponse> getCameraList(@RequestParam("id.in") List<Integer> idList); }
4. 调整Spring MVC的参数数量限制
如果接收服务限制了请求参数的数量,添加以下配置:
spring: mvc: max-request-params: 200 # 设置大于100的数值,适配批量ID参数
内容的提问来源于stack exchange,提问作者Шатов Данил
相关产品推荐
相关产品推荐

