web-dev-qa-db-fra.com

Suivez la redirection 302 en utilisant Spring restTemplate?

  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

J'avais l'impression qu'un 302 serait automatiquement suivi. Est-ce que je me trompe dans cette hypothèse? Je dois maintenant choisir cet emplacement et faire une nouvelle demande?

14
techie.brandon

À l'aide de l'implémentation ClientHttpRequestFactory par défaut - qui correspond à SimpleClientHttpRequestFactory -, le comportement par défaut consiste à suivre l'URL de l'en-tête d'emplacement (pour les réponses avec les codes d'état 3xx), mais uniquement si la demande initiale était une demande GET.

Des détails peuvent être trouvés dans cette classe - en recherchant la méthode suivante:

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

    ...

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

Voici le commentaire doc correspondant à la méthode HttpURLConnection.setInstanceFollowRedirects:

Définit si les redirections HTTP (demandes avec le code de réponse 3xx) doivent être automatiquement suivi de cette {@code HttpURLConnection} exemple. 

La valeur par défaut provient de followRedirects, dont la valeur par défaut est true.

17
fateddy

Lorsque vous utilisez la méthode CommonsClientHttpRequestFactory (qui utilise HttpClient v3 dessous), vous pouvez remplacer la méthode postProcessCommonsHttpMethod et suivre les redirections.

public class FollowRedirectsCommonsClientHttpRequestFactory extends CommonsClientHttpRequestFactory {

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

Vous pouvez ensuite l'utiliser comme ceci (avec une instance HttpClient facultative, éventuellement préconfigurée) et les demandes suivront les en-têtes location en réponse:

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

Essayez-vous de rediriger d'un protocole à un autre, par exemple de http à https ou vice versa? Si tel est le cas, la redirection automatique ne fonctionnera pas. Voir ce commentaire: URLConnection ne suit pas la redirection

Après discussion entre les ingénieurs de Java Networking, nous pensons que nous ne devrait pas suivre automatiquement la redirection d’un protocole à un autre, par exemple, de http à https et vice versa, cela peut avoir conséquences graves pour la sécurité

à partir de https://bugs.Java.com/bugdatabase/view_bug.do?bug_id=4620571

Sinon, si vous déboguez le code RestTemplate, vous verrez que par défaut, HttpURLConnection est défini correctement avec getInstanceFollowRedirects() == true.

0
Vladimir Mitev