FileNotFoundException avec une URL valide

Décidément, j’ai plein de choses à dire en ce moment.
D’ailleurs, j’ai encore 2-3 entrées sous le coude, que je vais me garder pour la semaine prochaine…

Voilà donc le scénario :

  • Vous essayez de récupérer le contenu d’une page Web dans une application Java.
  • L’URL que vous voulez appeler est valide, elle fonctionne dans votre navigateur Web.
  • Malheureusement, votre code lance une exception FileNotFoundException.
  • Vous avez aussi tenté d’utiliser URLEncoder, sans succès.

En fait, votre code doit à peu près ressembler à ça :

public static void main( String[] args ) {

	try {
		String base = "http://mon/url";

		InputStream in = new URL( base ).openConnection().getInputStream();
		BufferedReader rd = new BufferedReader( new InputStreamReader( in ));
		StringBuffer sb = new StringBuffer();
		String line;
		while(( line = rd.readLine()) != null )
			sb.append( line );

		rd.close();
		in.close();
		System.out.println( sb.toString());

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

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

J’ai eu le problème, devinez quoi, en essayant de récupérer une page d’un blog WordPress.
Sur l’index, ça marche très bien. Et sur d’autres pages, pas du tout. Je précise que j’ai activé la réécriture d’URL sur mon serveur, et les permaliens sur le blog.

Bref…
Une des explications possibles que j’ai trouvées sur le net pourrait être un problème de User Agent.
Pourquoi pas…

Toujours est-il que voilà une solution.
Elle consiste à utiliser la librairie HTTP Client d’Apache.
Avec le code suivant, les URL qui vous plantaient avec le code plus haut, passent maintenant très bien.

public static void main( String[] args ) {

	try {
		String base = "http://mon/url";

		HttpClient httpClient = new DefaultHttpClient();
		HttpGet pageGet = new HttpGet( new URI( base ));
		HttpResponse response = httpClient.execute( pageGet );
		InputStream in = response.getEntity().getContent();

		BufferedReader rd = new BufferedReader( new InputStreamReader( in ));
		StringBuffer sb = new StringBuffer();
		String line;
		while(( line = rd.readLine()) != null )
			sb.append( line );

		rd.close();
		in.close();
		System.out.println( sb.toString());

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

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

	} catch( URISyntaxException e ) {
		e.printStackTrace();
	}
}
Publicités

Une réflexion sur “FileNotFoundException avec une URL valide

  1. Il y a un élément que j’ai découvert un peu plus tard. C’est que Firefox est très souple.

    Si jamais l’URL qui ne passe pas pointe sur un site associé à un blog WordPress, ce billet pourrait aussi vous intéresser.

    En gros, peut-être que l’URL ne passe pas à cause d’un code HTTP indiquant une erreur. Et ce même si la réponse contient bien un corps de page.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s