【问题标题】:How to get redirected url from RestTemplate?如何从 RestTemplate 获取重定向的 url?
【发布时间】:2016-12-11 00:10:16
【问题描述】:

我想用 http GET 调用 RestTemplate 并检索状态代码和重定向的 url(如果有的话)。

如何实现?

【问题讨论】:

    标签: java spring url redirect resttemplate


    【解决方案1】:

    在 SimpleClientHttpRequestFactory 中使用 Spring 并覆盖 prepareConnection()...

    RestTemplate restTemplate = new RestTemplate( new SimpleClientHttpRequestFactory(){
        @Override
        protected void prepareConnection( HttpURLConnection connection, String httpMethod ) {
            connection.setInstanceFollowRedirects(false);
        }
    } );
    
    ResponseEntity<Object> response = restTemplate.exchange( "url", HttpMethod.GET, null, Object.class );
    int statusCode = response.getStatusCodeValue();
    String location = response.getHeaders().getLocation() == null ? "" : response.getHeaders().getLocation().toString();
    

    【讨论】:

      【解决方案2】:
      var responseEntity = restTemplate.exchange("someurl", HttpMethod.GET, null, Object.class);
      HttpHeaders headers = responseEntity.getHeaders();
      URI location = headers.getLocation();
      location.toString();
      

      【讨论】:

      • 这不起作用。 RestTemplate 将遵循重定向。
      • 我认为不是默认的 httpclient。
      【解决方案3】:
      1. 使用自定义 RedirectStrategy 创建 Apache HttpClient,您可以在其中拦截发生重定向时的中间响应。
      2. 将默认请求工厂替换为 HttpComponentsClientHttpRequestFactory 和新的 Apache HttpClient

      查看org.apache.http.client.RedirectStrategy 了解更多信息。或者重用DefaultRedirectStrategy,如下例所示:

      CloseableHttpClient httpClient = HttpClientBuilder
              .create()
              .setRedirectStrategy( new DefaultRedirectStrategy() {
      
                  @Override
                  public boolean isRedirected(HttpRequest request, HttpResponse response,
                          HttpContext context) throws ProtocolException {
      
                      System.out.println(response);
      
                      // If redirect intercept intermediate response.
                      if (super.isRedirected(request, response, context)){
                          int statusCode  = response.getStatusLine().getStatusCode();
                          String redirectURL = response.getFirstHeader("Location").getValue();
                          System.out.println("redirectURL: " + redirectURL);
                          return true;
                      }
                      return false;
                  }
              })
              .build();
      HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
      RestTemplate restTemplate = new RestTemplate(factory);
      .......
      

      【讨论】:

        猜你喜欢
        • 2013-02-24
        • 1970-01-01
        • 2011-03-22
        • 2018-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-29
        相关资源
        最近更新 更多