web-dev-qa-db-ja.com

Spring restTemplateを使用して302リダイレクトに従いますか?

  RestTemplate restTemplate = new RestTemplate();

  final MappingJackson2XmlHttpMessageConverter converter = new MappingJackson2XmlHttpMessageConverter();
  final List<MediaType> supportedMediaTypes = new LinkedList<MediaType>(converter.getSupportedMediaTypes());
  supportedMediaTypes.add(MediaType.ALL);
  converter.setSupportedMediaTypes(supportedMediaTypes);
  restTemplate.getMessageConverters().add(converter);  


  ResponseEntity<MyDTO[]> response = restTemplate.getForEntity(urlBase, MyDTO[].class);

  HttpHeaders headers = response.getHeaders();
  URI location = headers.getLocation(); // Has my redirect URI

  response.getBody(); //Always null

302が自動的に追跡されるという印象を受けました。この仮定は間違っていますか?この場所を選択して再リクエストする必要がありますか?

16
techie.brandon

SimpleClientHttpRequestFactory であるデフォルトのClientHttpRequestFactory実装を使用する-デフォルトの動作は、ロケーションヘッダーのURLに従うことです(ステータスコード3xx)-ただし、最初のリクエストがGETrequestの場合のみ。

詳細はこのクラスで見つけることができます-次のメソッドを検索します:

protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {

    ...

    if ("GET".equals(httpMethod)) {
        connection.setInstanceFollowRedirects(true);
    }

ここで、関連するドキュメントコメントHttpURLConnection.setInstanceFollowRedirects 方法:

この{@code HttpURLConnection}インスタンスがHTTPリダイレクト(応答コード3xxの要求)の後に自動的に続くかどうかを設定します。

デフォルト値はfollowRedirectsから取得され、デフォルトはtrueです。

19
fateddy

CommonsClientHttpRequestFactory (下で HttpClient v を使用)を使用する場合、 postProcessCommonsHttpMethod メソッドをオーバーライドして、リダイレクトに従うように設定できます。

public class FollowRedirectsCommonsClientHttpRequestFactory extends CommonsClientHttpRequestFactory {

  @Override
  protected void postProcessCommonsHttpMethod(HttpMethodBase httpMethod) {
    httpMethod.setFollowRedirects(true);
  }
}

次に、このように(オプションの、場合によっては事前構成されたHttpClientインスタンスを使用して)使用し、応答でlocationヘッダーに従います。

RestTemplate restTemplate = new RestTemplate(
      new FollowRedirectsCommonsClientHttpRequestFactory());
0
Mrkvozrout

あるプロトコルから別のプロトコルにリダイレクトしようとしていますか? httpからhttps、またはその逆?その場合、自動リダイレクトは機能しません。このコメントを参照してください: RLConnectionはリダイレクトに従いません

Javaネットワーキングエンジニアの間で議論した後、あるプロトコルから別のプロトコルへのリダイレクト(httpからhttpsへ、またはその逆など)を自動的に追跡するべきではないと考えられます。結果

from https://bugs.Java.com/bugdatabase/view_bug.do?bug_id=4620571

それ以外の場合、RestTemplateコードをデバッグすると、デフォルトでHttpURLConnectiongetInstanceFollowRedirects() == trueで適切に設定されていることがわかります。

0
Vladimir Mitev