2016-12-21 163 views
0

我正在尋找一種將POST請求從一個SpringBoot應用程序直接轉發到另一個SpringBoot應用程序的方法。轉發GET請求非常簡單,下面的代碼顯示了當我懶洋洋地嘗試重新使用相同的重定向路徑時,如何得到405錯誤。將POST請求從一個REST API轉發/重定向到另一個REST API

我看了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); 
    } 
} 

回答

0

我解決了這個而回,以防萬一有人有興趣:

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