如何获取Spring Boot后端HTTP状态码并在前端触发对应toast提示
问题根因
你目前遇到错误toast无法触发的问题,常见原因有3个:
- 手动拼接JSON字符串的方式极易产生非法JSON,当
raw[0]/raw[1]包含双引号、换行等特殊字符时,请求还未发出就会前端报错,不会进入任何回调逻辑 - 后端异常未被预期捕获,或是项目中存在全局异常处理器
@RestControllerAdvice拦截了你的ResponseEntity,将非2xx状态码强制修改为200 - 测试时未触发后端异常分支,所有请求都走了正常返回200的逻辑
修复方案
1. 优化前端请求逻辑
删除手动拼接JSON的代码,直接构造JS对象避免格式错误;同时配置observe: 'response'直接获取原生HTTP状态码,不需要依赖响应体返回的状态值:
postcompetenze(raw: any){ // 直接构造对象,避免手动拼接JSON出错 const obj = { id: 0, nome: raw[0], descrizione: raw[1] }; // 配置observe: 'response'获取完整响应对象,直接读取原生状态码 this.http.post('http://localhost:8080/postcompetenza', obj, {observe: 'response'}) .subscribe({ next: (resp) => { console.log("响应状态码:", resp.status); // 你需要把状态存入res变量的话,直接在这里赋值即可,不要在subscribe外同步赋值 // this.res = resp.status; if(resp.status === 200){ this.toastr.success("dipendente inserito correttamente","SUCCESSO"); }else{ this.toastr.error("dipendente non inserito","ERRORE"); } }, error: (err) => { console.error('请求错误,状态码:', err.status); // this.res = err.status; this.toastr.error("dipendente non inserito","ERRORE"); } }) }
2. 优化后端返回逻辑
你已经通过ResponseEntity设置了标准HTTP状态码,不需要再在响应体里重复返回状态值,可以直接返回业务对象或错误信息:
@CrossOrigin(origins = "http://localhost:4200") @PostMapping("postcompetenza") public ResponseEntity<?> addCompetenza(@RequestBody competenza comp) { try { competenza response = cs.addCompetenza(comp); // 成功返回200,响应体带保存后的业务对象 return ResponseEntity.ok(response); } catch (IllegalArgumentException e) { // 冲突返回409,响应体带错误提示 return ResponseEntity.status(HttpStatus.CONFLICT).body(e.getMessage()); } catch (BadRequest e) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage()); } catch (Exception e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("服务内部错误"); } }
3. 验证异常分支
可以在后端cs.addCompetenza(comp)执行前主动抛出IllegalArgumentException做测试,确认请求会进入前端的error回调并弹出错误toast。如果还是未触发,检查全局异常处理器是否修改了你的返回状态码。
内容的提问来源于stack exchange,提问作者pietro
相关产品推荐
相关产品推荐

