将POST请求从一个REST API转发/重定向到另一个REST API

时间:2016-12-21 15:30:36

标签: rest redirect post spring-boot

我希望实现一种将POST请求从一个SpringBoot应用程序直接转发到另一个SpringBoot应用程序的方法。转发GET请求很简单,下面的代码显示了当我懒洋洋地尝试重新使用相同的重定向路径时如何得到405错误。

我已经查看了StackOverflow上的现有示例(最值得注意的是here),但我甚至无法获得编译的解决方案。任何人都可以建议修改下面的代码,让我只通过?

重定向整个POST请求
@RestController
public class Routing {

    @Autowired
    private RoutingDelegate routingDelegate;

    @RequestMapping(value="/**", method=RequestMethod.GET, produces=MediaType.TEXT_PLAIN_VALUE)
    public ResponseEntity<String> catchAll(HttpServletRequest request, HttpServletResponse response){
        return routingDelegate.redirect(request, response);
    }

    @RequestMapping(value="/**", method=RequestMethod.POST, produces=MediaType.TEXT_PLAIN_VALUE)
    public ResponseEntity<String> catchAllPost(HttpServletRequest request, HttpServletResponse response){
        /**
         * This returns a 405 error, which is understandable since I'm redirecting a POST request to a GET endpoint
         */
        return routingDelegate.redirect(request, response);
    }
}

@Service
public class RoutingDelegate {

    private final String baseServerUrl = "http://localhost:8080";

    public ResponseEntity<String> redirect(HttpServletRequest request, HttpServletResponse response){
        try {
            String queryString = request.getQueryString();
            String redirectUrl = baseServerUrl + request.getRequestURI() +
                    (queryString != null ? "?" + queryString : "");
            response.sendRedirect(redirectUrl);
        }
        catch (IOException e) {
            return new ResponseEntity<String>("REDIRECT ERROR", HttpStatus.INTERNAL_SERVER_ERROR);
        }
        return new ResponseEntity<String>("", HttpStatus.OK);
    }
}

1 个答案:

答案 0 :(得分:2)

我暂时解决了这个问题,以防万一有人感兴趣:

@Service
public class RoutingDelegate {

    private final String baseServerUrl = "http://localhost:8080";

    public ResponseEntity<String> redirectPost(HttpServletRequest request, HttpServletResponse response){
        String responseString = "";
        try {
            // build up the redirect URL
            String queryString = request.getQueryString();
            String redirectUrl = baseServerUrl + request.getRequestURI() +
                    (queryString != null ? "?" + queryString : "");

            responseString = forwardPostRequest(redirectUrl, request);
        }
        catch (Exception e) {
            return new ResponseEntity<String>("REDIRECT ERROR", HttpStatus.INTERNAL_SERVER_ERROR);
        }
        return new ResponseEntity<String>(responseString, HttpStatus.OK);
    }

    private String forwardPostRequest(String url, HttpServletRequest request){
        String responseString = "";
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

        // rebuild map from params
        MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>();
        for (Entry<String, String[]> entry : request.getParameterMap().entrySet()) {
            String key = entry.getKey();
            String[] values = entry.getValue();
            map.add(key, values[0]);
        }

        HttpEntity<MultiValueMap<String, String>> newRequest = new HttpEntity<MultiValueMap<String, String>>(map, headers);

        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> responseEntity = restTemplate.postForEntity( url, newRequest , String.class );
        responseString = responseEntity.getBody();
        return responseString;
    }
}