Spring Boot中如何从一个Controller的POST请求重定向到另一个Controller的POST请求
Spring Boot POST接口跳转解决方案
你之前使用HttpURLConnection未生效的核心原因是发送请求后没有将请求结果返回,代码逻辑还是走到了末尾的return "not found",所以无法拿到test2的执行结果。
以下是3种可直接落地的实现方案:
方案1:直接调用Controller Bean(同服务最优解)
Spring 管理的Controller本身就是容器中的单例Bean,直接注入调用即可,无额外网络开销,性能最高。
修改后的File1.java代码:
// 注入File2实例 @Autowired private File2 file2; @PostMapping("/test") public String testMap(String s){ if(s!=null){ return "found it"; } else { // 直接调用目标方法,参数直接传递 return file2.testMap2(s); } }
方案2:服务器内部转发
如果需要保留完整的HTTP请求处理链路,可使用forward前缀做内部转发,Spring会自动携带当前请求的所有参数、保持请求方法为POST跳转至目标接口,客户端无感知,地址栏不会变化。
修改后的File1.java代码:
@PostMapping("/test") public String testMap(String s){ if(s!=null){ return "found it"; } else { // 内部转发至/test2接口 return "forward:/test2"; } }
注意:不要使用redirect:前缀,重定向会默认转为GET请求,丢失POST参数。
方案3:HTTP客户端调用(适配微服务拆分场景)
如果后续有拆分为独立微服务的规划,需要走完整的HTTP请求流程,推荐使用Spring封装的RestTemplate,比原生HttpURLConnection更易用。
首先注册RestTemplate Bean:
@Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } }
修改File1.java代码:
@Autowired private RestTemplate restTemplate; @PostMapping("/test") public String testMap(String s){ if(s!=null){ return "found it"; } else { // 构造POST请求参数 MultiValueMap<String, String> params = new LinkedMultiValueMap<>(); params.add("s", s); // 发起POST请求,注意替换为你项目实际的端口 String result = restTemplate.postForObject("http://localhost:8080/test2", params, String.class); return result; } }
内容的提问来源于stack exchange,提问作者s21s
相关产品推荐
相关产品推荐

