Comment obtenir une URL remplacée/redirigée par du code java


Lors de l'analyse d'une page Web, j'obtiens le lien href= http://www.onvista.de/aktien/snapshot.html?ID_OSI=36714349 Lors de l'émission de ce lien dans mon navigateur, il le remplace par " http://www.onvista.de/aktien/Adidas-Aktie-DE000A1EWWW0" et le rend correctement. Mais avec java, je ne parviens pas à récupérer la page. J'ai utilisé l'exemple suivant qui a été suggéré ici pour afficher les URL redirigées.

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class GetRedirected {

    public GetRedirected() throws MalformedURLException, IOException {
        String url="http://www.onvista.de/aktien/snapshot.html?ID_OSI=36714349";
        URLConnection con = new URL( url ).openConnection();
        System.out.println( "orignal url: " + con.getURL() );
        con.connect();
        System.out.println( "connected url: " + con.getURL() );
        InputStream is = con.getInputStream();
        System.out.println( "redirected url: " + con.getURL() );
        is.close();
    }

    public static void main(String[] args) throws Exception {
        new GetRedirected();
    }
}

Mais il échoue à l'instruction "InputStream is ="avec le message d'erreur joint. Comment puis-je résoudre ce problème. Toute idée est la bienvenue.

Url d'origine: www.onvista.de/aktien/snapshot.html?ID_OSI=36714349

Url connectée: www.onvista.de/aktien/snapshot.html?ID_OSI=36714349

Exception dans le thread "principal" java. io. IOException: Le serveur a renvoyé HTTP

Code de réponse: 403 pour l'URL: www.onvista.de/aktien/snapshot.html?ID_OSI=36714349

, Au soleil.net.www.le protocole.http.HttpURLConnection.getInputStream(Source Inconnue)

À de.gombers.courtier....

Author: Ashot Karakhanyan, 2014-02-15

2 answers

Erreur très courante: Lorsque le code d'état HTTP d'une réponse de HttpURLConnection indique une erreur (AFAIK >= 400), l'accès à getInputStream() lève une exception. Vous devez vérifier getResponseCode(), puis décider si vous devez appeler getInputStream() ou getErrorStream(). Donc, au lieu d'appeler getInputStream(), vous devez d'abord appeler getResponseCode().

Mais en fait je ne peux pas reproduire votre erreur, pour moi cela fonctionne (bien que j'utilise une petite bibliothèque d'abstraction appelée DavidWebb:

public void testAktienAdidas() throws Exception {

    Webb webb = Webb.create();
    Response<String> response = webb
            .get("http://www.onvista.de/aktien/snapshot.html?ID_OSI=36714349")
            .asString();

    assertEquals(200, response.getStatusCode());
    assertNotNull(response.getBody());
    assertTrue(response.getBody().contains("<!DOCTYPE html>"));
}

Je ne reçois pas de redirection, probablement cela est fait côté client via JavaScript ou il existe une logique côté serveur qui évalue les en-têtes HTTP comme User-Agent.

Mais si vous rencontrez des redirections, vous pouvez dire à HttpURLConnection de les suivre automatiquement:

conn.setInstanceFollowRedirects(true);
 0
Author: hgoebl, 2014-02-15 09:09:48
you can get retrieve it by this code
package Test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpRedirectExample {

  public static void main(String[] args) {

    try {

    String url = "http://www.onvista.de/aktien/snapshot.html?ID_OSI=36714349";
//  String urlTest="https://api.twitter.com/oauth/authenticate";

URL obj = new URL(url);
    HttpURLConnection conn = (HttpURLConnection) obj.openConnection();
    conn.setReadTimeout(5000);
    conn.addRequestProperty("Accept-Language", "en-US,en;q=0.8");
    conn.addRequestProperty("User-Agent", "Mozilla");
    conn.addRequestProperty("Referer", "google.com");

    System.out.println("Request URL ... " + url);

    boolean redirect = false;


    int status = conn.getResponseCode();
    if (status != HttpURLConnection.HTTP_OK) {
        if (status == HttpURLConnection.HTTP_MOVED_TEMP
            || status == HttpURLConnection.HTTP_MOVED_PERM
                || status == HttpURLConnection.HTTP_SEE_OTHER)
        redirect = true;
    }

    System.out.println("Response Code ... " + status);

    if (redirect) {

        // get redirect url from "location" header field
        String newUrl = conn.getHeaderField("Location");

        // get the cookie if need, for login
        String cookies = conn.getHeaderField("Set-Cookie");

        // open the new connnection again
        conn = (HttpURLConnection) new URL(newUrl).openConnection();
        conn.setRequestProperty("Cookie", cookies);
        conn.addRequestProperty("Accept-Language", "en-US,en;q=0.8");
        conn.addRequestProperty("User-Agent", "Mozilla");
        conn.addRequestProperty("Referer", "google.com");

        System.out.println("Redirect to URL : " + newUrl);

    }

    BufferedReader in = new BufferedReader(
                              new InputStreamReader(conn.getInputStream()));
    String inputLine;
    StringBuffer html = new StringBuffer();

    while ((inputLine = in.readLine()) != null) {
        html.append(inputLine);
    }
    in.close();

    System.out.println("URL Content... \n" + html.toString());
    System.out.println("Done");

    } catch (Exception e) {
    e.printStackTrace();
    }

  }

}
 0
Author: BoldHD, 2015-03-05 11:52:32