Méthode file_get_contents php - Problème de géocoding yahoo

Nouveau WRInaute
Bonjour à tous,

Je me permets de vous solliciter pour un problème qui m'est incompréhensible et pour lequel j'aimerais que vous m'éclairiez.

Je possède une page sur un site qui me permet d'afficher les agences d'une entreprise à la googlemaps. J'utilise le géocoding de yahoo qui est plus pertinent et plus précis et me permets de récupérer la latitude et la longitude terrestre d'une adresse. Tout fonctionnait correctement depuis 6 mois, et depuis peu, j'ai des erreurs file_get_contents qui s'affichent : Warning: file_get_contents(url) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request.

L'url du file_get_contents est du type : http://api.local.yahoo.com/MapsService/V1/geocode?appid=yahoo_05e982f0 ... &location=

Le paramètre location est rempli correctement et est du type : adresse, CP ville, Pays. Les 4 valeurs sont concaténées et transformées avec rawurlencode et donc avec des %20 pour les espaces, des %E9 pour les "é" ....

Mon problème est le suivant : Je me suis aperçu que les erreurs file_get_contents étaient dûes au faite que dans certaines adresses, il y avait des accents du genre (54%20avenue%20Saint%20Andr%E9). A partir de ce moment, je me suis dis qu'il s'agissait d'une problème d'encodage. Mais pourquoi, et pourquoi cela a changé de fonctionnement ?
Après quelques tests, je me suis créé un petit fichier test avec une adresse contenant un accent avec le code suivant :

Code:
<?php 
    $address = strtolower("Cour Napoléon, 75001 Paris");
    $url = 'http://api.local.yahoo.com/MapsService/V1/geocode';
    $url .= sprintf('?appid=%s&location=%s',"yahoo_ab67cd17a7",rawurlencode($address));
    $result = false;
    if($result = file_get_contents($url)) {
		preg_match('!<Latitude>(.*)</Latitude><Longitude>(.*)</Longitude>!U', $result, $match);
 		if (isset($match) )  {
       	 	       $geocode = array('latitude'  =>  $match[1],'longitude' =>  $match[2]);
			echo($geocode['latitude'].", ".$geocode['longitude']);
  		}          
	} 
	
?>

Pour tester, je me suis créer deux fichiers : un premier fichier enregistré en iso-8859-1 et un autre fichier enregistré en utf-8 avec bien entendu exactement le même code cité ci-dessus. L'erreur apparaît alors dans le premier cas (iso-8859-1) mais pas dans le second cas (utf-8). Bizarre, d'autant plus, que l'adresse est encodée en rawurlencode. Je me suis dis alors qu'il s'agissait peut être d'une mauvaise configuration serveur mais pas du tout puisque ces deux cas sont identiques sur 2 serveurs apache en php5 et 1 serveur php4.
Enfin, j'ai gardé mes deux fichiers tels quels et j'ai testé avec un htaccess possédant le paramètre AddDefaultCharset UTF-8 et en suite avec un AddDefaultCharset ISO-8859-1 mais rien n'y fait. Le premier cas ne fonctionne pas tandis que le deuxième cas fonctionne.

Bien entendu, si l'adresse ne possède pas d'accents, les deux cas (iso et utf) fonctionnent.

Alors :
1 - Pourquoi une telle différence de fonctionnement en iso et utf-8 dans la mesure où l'adresse est encodée en rawurlencode ?
2 - Est ce que yahoo aurait changé des choses de leur coté ?
3 - pourquoi y aurait-il eu un changement de fonctionnement ?


Merci par avance de votre aide.
 
Nouveau WRInaute
Bonjour,

Et merci de cette réponse rapide.

En effet, j'avais testé et cela fonctionnait avec rawurlencode(utf8_encode($address)) pour un fichier iso. Mais cela implique que je dois modifier mon fichier, (ce que je ne voulais pas) pour que l'encodage de mon rawurlencode soit au format UTF-8 et non iso. En gros, les "é" en iso-8859-1 sont encodés "%E9" et les "é" en UTF-8 sont encodés "%C3%A9". Pour du coup, la finalité de l'url n'est plus du tout la même qu'au départ et c'est surement pourquoi yahoo me retourne une "bad request".

Comme je le précisais au début, le fichier était encodé en ISO et la requête sur yahoo fonctionnait. Maintenant, cela ne fonctionne plus. Yahoo aurait il modifié des choses de son coté ? Car si ce n'est pas le cas, je ne comprends pas bien. Une configuration serveur serait elle en cause ?
 
WRInaute passionné
C'est logique que l'API de yahoo attende de l'UTF8 car elle doit pouvoir répondre dans tous les pays et toutes les langues.

Tu as deux solutions, soit tu modifies l'encodage de ton site (et de sa base de données si l'adresse vient de là) pour être en utf8 soit tu utilises la conversion avec la fonction utf8_encode.

je ne sais pas si c'est normal qu'ils aient modifié le fonctionnement mais ça ne changera rien à ton problème.
 
Nouveau WRInaute
Merci beaucoup forty, tu m'as permis d'avancer.

Je comprends que yahoo passe à UTF-8 surtout que les adresses Web vont pouvoir bientôt accepter prochainement les caractères spéciaux et donc UTF-8. C'est sûrement pour cela mais ils pourraient prévenir.

Si tu as d'autres commentaires à faire, n'hésites pas.
 
WRInaute passionné
jcaron a dit:
Tu as publié ton app_id Yahoo, je ne suis pas sûr que ce soit une bonne idée...

Jacques.
c'est pas compliqué d'en récupérer une gratuitement ici : -https://developer.yahoo.com/wsregapp/
 
WRInaute accro
Et si quelqu'un la récupère et fait tout plein de requêtes avec et atteint le nombre de requêtes/jour autorisé ses appels ne marcheront plus... S'ils attribuent des app_ids différentes à chaque utilisateur c'est qu'il y a une bonne raison...

Jacques.
 
Discussions similaires
Haut