Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从RestTemplate获取重定向url?_Java_Spring_Url_Redirect_Resttemplate - Fatal编程技术网

Java 如何从RestTemplate获取重定向url?

Java 如何从RestTemplate获取重定向url?,java,spring,url,redirect,resttemplate,Java,Spring,Url,Redirect,Resttemplate,我想使用http GET调用RestTemplate并检索状态代码和重定向的url(如果有) 如何做到这一点 使用自定义的重定向策略创建ApacheHttpClient,您可以在重定向发生时拦截中间响应 将默认请求工厂替换为HttpComponentsClientHttpRequestFactory和新的ApacheHttpClient 有关更多信息,请查看。或者重复使用DefaultRedirectStrategy,如下例所示: CloseableHttpClient httpClient =

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

如何做到这一点

  • 使用自定义的重定向策略创建Apache
    HttpClient
    ,您可以在重定向发生时拦截中间响应
  • 将默认请求工厂替换为
    HttpComponentsClientHttpRequestFactory
    和新的Apache
    HttpClient
  • 有关更多信息,请查看。或者重复使用
    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);
    .......
    

    在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();
    
    RestTemplate RestTemplate=新的RestTemplate(新的SimpleClientHttpRequestFactory()){
    @凌驾
    受保护的void prepareConnection(HttpURLConnection连接,字符串httpMethod){
    connection.setInstanceFollowDirections(false);
    }
    } );
    ResponseEntity response=restemplate.exchange(“url”,HttpMethod.GET,null,Object.class);
    int statusCode=response.getStatusCodeValue();
    字符串位置=响应。getHeaders()。getLocation()==null?“”:response.getHeaders().getLocation().toString();
    
    这不起作用。RestTemplate将遵循重定向。我认为,不是默认的httpclient。
    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();