HomerPlata
HomerPlata

Reputation: 1797

Forwarding/redirecting a POST request from one REST API to another

I'm looking to implement a way of directly forwarding a POST request from one SpringBoot application to another. Forwarding GET requests has been easy, and the code below shows how I get a 405 error when I lazily try to re-use the same redirection pathway.

I have looked at existing examples on StackOverflow (most notably here) but I can't even get that solution to compile. Can anyone suggest amendments to the code below to allow me to just redirect the entire POST request through?

@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);
    }
}

Upvotes: 3

Views: 8795

Answers (1)

HomerPlata
HomerPlata

Reputation: 1797

I solved this a while back, just in case anyone is interested:

@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;
    }
}

Upvotes: 2

Related Questions