Reputation: 1797
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
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