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

About this entry