2017-01-12 5 views
1

У меня есть требование использовать Spring MVC для перенаправления на внешнюю службу с помощью POST с созданным объектом.Spring MVC Перенаправление с ответом HTTP POST

От чтения this previous question Я понимаю, что это невозможно сделать с помощью перенаправления Spring MVC, поэтому требуется выполнить запрос POST через HTTP-клиент в Java-коде, который я могу выполнить с помощью примера, такого как найдено here.

Мне нужно перенаправить браузер на ответ запроса POST, но я не уверен, как это сделать с помощью Spring MVC.

Контроллер

@RequestMapping(method = RequestMethod.GET, value = "/handoff") 
public HttpEntity dispatch(HttpServletRequest request, 
    @RequestParam(value = "referralURL", required = false) String referralUrl) { 

    String redirectURL = "http://desinationURL.com/post"; 

    HttpClientHelper httpHelper = new HttpClientHelper(); 
    HttpEntity entity = httpHelper.httpClientPost(redirectURL, null); 

    // Redirect 
    return entity; 
} 

HttpClientHelper.java

public HttpEntity httpClientPost(String url, List<NameValuePair> params) throws ClientProtocolException, IOException { 

    HttpClient httpclient = HttpClients.createDefault(); 
    HttpPost httppost = new HttpPost(url); 

    // Request parameters and other properties. 
    if (params != null) { 
     httppost.setEntity(new UrlEncodedFormEntity(params, Constants.UTF_8_ENCODING)); 
    } 

    // Execute and get the response. 
    HttpResponse response = httpclient.execute(httppost); 
    HttpEntity entity = response.getEntity(); 

    return entity; 

} 

Я вижу, что цель службы удара запрос POST успешно, мне нужно прочитать вывод ответа как возврат значение из контроллера MCV, так как он в настоящее время просто возвращает значение 404.

ответ

0

Используйте sendRedirect вместо HttpClient, ваш метод контроллера должен выглядеть следующим образом.

@RequestMapping(method = RequestMethod.GET, value = "/handoff") 
public HttpEntity dispatch(HttpServletRequest request, HttpServletResponse response, 
    @RequestParam(value = "referralURL", required = false) String referralUrl) { 

    String redirectURL = "http://desinationURL.com/post"; 

    response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT); 
    response.setHeader("Location", redirectURL); 

    // Redirect 
    return entity; 
} 
+0

Я включил HttpServletResponse и установите значение состояния и заголовок, как это предлагается, однако не перенаправлять еще возвращающую 404. Нужно ли мне изменить метод для вернуть ответ вместо HttpEntity? –

1

Вы не можете перенаправить браузера на ответ запроса POST. Все, что вы можете сделать, это отправить результат вызова на внешний URL. Или обработайте ответ каким-то образом, а затем перейдите на другую страницу вашего приложения, которая отображает некоторую информацию об ответе.

например.

@RequestMapping(method = RequestMethod.GET, value = "/handoff") 
public void dispatch(HttpServletRequest request, 
    @RequestParam(value = "referralURL", required = false) String referralUrl, HttpServletResponse response) { 

    String redirectURL = "http://desinationURL.com/post"; 

    HttpClientHelper httpHelper = new HttpClientHelper(); 
    HttpEntity entity = httpHelper.httpClientPost(redirectURL, null); 

    //streams the raw response 
    entity.writeTo(response.getOutputSStream()); 
} 
0

Если вы заинтересованы в более привлекательном решении, вы можете использовать Zuul для этого и управлять zuul при отправке запроса. https://github.com/Netflix/zuul Во время цепочки фильтров вы можете манипулировать запросом, как хотите.

1

Это, как я это сделал

CloseableHttpClient httpClient = HttpClients.custom() 
      .setRedirectStrategy(new LaxRedirectStrategy()) 
      .build(); 

    //this reads the input stream from POST 
    ServletInputStream str = request.getInputStream(); 

    HttpPost httpPost = new HttpPost(path); 
    HttpEntity postParams = new InputStreamEntity(str); 
    httpPost.setEntity(postParams); 

    HttpResponse httpResponse = null ; 
    int responseCode = -1 ; 
    StringBuffer response = new StringBuffer(); 

    try { 

     httpResponse = httpClient.execute(httpPost); 

     responseCode = httpResponse.getStatusLine().getStatusCode(); 
     logger.info("POST Response Status:: {} for file {} ", responseCode, request.getQueryString()); 

     //return httpResponse ; 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       httpResponse.getEntity().getContent())); 

     String inputLine; 
     while ((inputLine = reader.readLine()) != null) { 
      response.append(inputLine); 
     } 
     reader.close(); 

     logger.info(" Final Complete Response {} " + response.toString()); 
     httpClient.close(); 

    } catch (Exception e) { 

     logger.error("Exception ", e); 

    } finally { 

     IOUtils.closeQuietly(httpClient); 

    } 

    // Return the response back to caller 
    return new ResponseEntity<String>(response.toString(), HttpStatus.ACCEPTED);