2016-12-21 2 views
0

Я ищу, чтобы реализовать способ прямой пересылки запроса POST из одного приложения SpringBoot в другое. Перенаправить запросы GET было легко, и приведенный ниже код показывает, как я получаю ошибку 405, когда я лениво пытаюсь повторно использовать один и тот же путь перенаправления.Перенаправление/перенаправление запроса POST от одного 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; 
    } 
} 
Смежные вопросы