IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IGN API Géoportail Discussion :

Méthode Java appellant le service de géocodage


Sujet :

IGN API Géoportail

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 52
    Points : 42
    Points
    42
    Par défaut Méthode Java appellant le service de géocodage
    Bonjour,

    Suite à votre aide, j'ai enfin réussi à appelé le service de géocodage depuis des outils web. Mais maintenant, il me faudrait y accéder depuis notre application en Java. Ma méthode n'aboutit pas, plus particulièrement la méthode httpclient.executeMethod (ligne 44 dans le code qui suit).

    Je suis persuadé d'avoir oublier un petit truc tout bête mais je ne vois pas ... Et pourtant j'ai les yeux grand ouvert .

    J'ai essayé de nettoyer le code et de le limiter au plus bref mais je n'ai pas pu faire mieux désolé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    /**
         * Créée et envoie un flux XML via HTTP POST au serveur OpenLS (service de géocodage)
    	 * Récupère la réponse du serveur OpenLS et la retourne sous forme de String
    	 * @return ResponseBodyasString le flux XML de réponse du servuer OpenLS sous forme de String
         */
    	public String envoiRequeteGeocodeRecuperationResponseAlexTest(){
    		String responseBodyasString =null;//String contenant la réponse du serveur OpenLS (= le flux de géocodage)
    		String urlGeocodage = "https://gpp3-wxs.ign.fr/MA_CLE/geoportail/ols";
    
    		// Préparation de la méthode Post, qui créé une requete HTTP POST
    		PostMethod post = new PostMethod(urlGeocodage);
    
    		//Création et envoi d'un flux XML (fonctionne avec poster de mozilla firefox)
    		String fileContent = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><XLS xmlns:xls=\"http://www.opengis.net/xls\" xmlns:gml=\"http://www.opengis.net/gml\" xmlns=\"http://www.opengis.net/xls\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" version=\"1.2\" xsi:schemaLocation=\"http://www.opengis.net/xls http://schemas.opengis.net/ols/1.2/olsAll.xsd\"><RequestHeader/><Request requestID=\"1\" version=\"1.2\" methodName=\"LocationUtilityService\"><GeocodeRequest returnFreeForm=\"false\"><Address countryCode=\"StreetAddress\"><StreetAddress><Street>11 allée des sciences</Street></StreetAddress><Place type=\"Municipality\">Albi</Place><PostalCode>81000</PostalCode></Address></GeocodeRequest></Request></XLS>";
    		
    		// Ajout du body contenant le flux XML
    		StringRequestEntity strReqEnt = null;
    		try {
    			strReqEnt = new StringRequestEntity(fileContent,"text/xml","UTF-8");
    		} catch (UnsupportedEncodingException e1) {
    		}
    		post.setRequestEntity(strReqEnt);
    
    		//Configuration du header de la requete : 
    		//Content-length,
    		int length = fileContent.length();
    		String contentLength = String.valueOf(length);
    		post.setRequestHeader("Content-length", contentLength);
    		//Content-type,
    		post.setRequestHeader("Content-type", "text/xml");
    		// les authorisations -> contrat de type SIG donc avec id:pwd en base 64
    		post.setRequestHeader("Authorization", "Basic monIdPwdEnBase64");
    
    		//Création d'un nouveau client :
    		HttpClient httpclient = new HttpClient();
    		
    		// Envoi requete post
    		try{
    			//initialisation au besoin des informations sur l'authentification
    			System.err.println("Initialisation des informations d'authentification");//TODEL
    			SystemPropertyHelper.getInstance().setAuthentificationInfoForPostMethod(post);
    			
    			System.err.println("Exécution de la méthode post!");//TODEL
    			httpclient.executeMethod(post);
    			/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    			 * !!! cette méthode n'aboutis pas !!!
    			 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
    			
    			// Réception de la réponse et on la stocke sous forme de String : 
    			responseBodyasString = post.getResponseBodyAsString();
    			
    		}catch(HttpException he){
    		} catch (IOException e) {
    		}finally {//On coupe la connexion
    			post.releaseConnection();
    		}		
    
    		return responseBodyasString;
    	}
    Merci d'avance

  2. #2
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 52
    Points : 42
    Points
    42
    Par défaut erreur 403 ...
    En testant une autre méthode, j'ai réussi à me débloquer ... mais maintenant j'ai une erreur 403.

    Je précise que j'ai un contrat de type SIG donc par identifiant/mot de passe. J'avais réussi à faire une connexion grâce à l'outil poster de firefox mais l'"Authorization" était dans le header, est-ce que ça change quelque chose ?

    Je pense que je ne donne pas mes identifiant et mot de passe correctement ... Cette fois, j'utilise en fait une URLConnection voilà le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    String urlGeocodage = "https://gpp3-wxs.ign.fr/MA_CLE/geoportail/ols";
    
    //Création et envoi d'un flux XML (fonctionne avec poster de mozilla firefox)
    String fileContent = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><XLS xmlns:xls=\"http://www.opengis.net/xls\" xmlns:gml=\"http://www.opengis.net/gml\" xmlns=\"http://www.opengis.net/xls\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" version=\"1.2\" xsi:schemaLocation=\"http://www.opengis.net/xls http://schemas.opengis.net/ols/1.2/olsAll.xsd\"><RequestHeader/><Request requestID=\"1\" version=\"1.2\" methodName=\"LocationUtilityService\"><GeocodeRequest returnFreeForm=\"false\"><Address countryCode=\"StreetAddress\"><StreetAddress><Street>11 allée des sciences</Street></StreetAddress><Place type=\"Municipality\">Albi</Place><PostalCode>81000</PostalCode></Address></GeocodeRequest></Request></XLS>";
    URL url;
    try {
    	url = new URL(urlGeocodage);
    		
    	URLConnection connection = url.openConnection();
    	String auth = new BASE64Encoder().encode((monId+":"+monPwd).getBytes());
    	connection.setRequestProperty("Authorization", "Basic " + auth);
    	connection.setRequestProperty("Content-Type", "text/xml");
    	connection.setDoOutput(true); // pour poster
    	connection.setDoInput(true); // pour lire la réponse
    			
    	// Écriture du POST
    	OutputStreamWriter osw = new OutputStreamWriter(connection.getOutputStream());
    	osw.append(fileContent);
    	osw.flush();
    	osw.close();
    			
    	System.err.println("\n\nlecture de l'inputstream");//TODEL
    	byte[] buffer = new byte[1000];
    	InputStream input = connection.getInputStream();
    	while(input.read(buffer)!=-1){
    		System.err.println(buffer);//TODEL
    	}
    						
    } catch (MalformedURLException e1) {
    	// TODO Auto-generated catch block
    	e1.printStackTrace();
    } catch (IOException e) {
    	// TODO Auto-generated catch block
    	e.printStackTrace();
    }
    Si vous avez une idée, je suis preneur

    Encore une fois merci d'avance !

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    2 119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 2 119
    Points : 1 764
    Points
    1 764
    Par défaut Wireshark est mon ami !
    Dans ce genre de circonstances (une version qui marche et l'autre qui échoue), je prends les moyens lourds: une trace des échanges en IP avec Whireshark.
    Même si on a un passage en https, on peut faire des comparaisons.

    Une autre solution est d'utiliser un proxy type http://www.fiddler2.com/fiddler2/

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 52
    Points : 42
    Points
    42
    Par défaut
    J'ai réussi à faire une requête qui me renvoie une réponse !!!

    Je verrai plus tard pour pister l'erreur de la première méthode(j'ai pris un peu de retard avec tous ça ...).

    Je suis parti sur la deuxième méthode. Et j'ai compris que l'URLConnection n'allais pas trop, il faut la caster en une HttpURLConnection pour pouvoir utiliser la méthode setRequestMethod.

    Tous ça pour lui dire de passer la requête en "POST" ...

    bon pour les intéressés, je met ces deux misérables (mais non moins utiles) lignes de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    HttpURLConnection httpconnection = (HttpURLConnection) connection;
    httpconnection.setRequestMethod("POST");
    à mettre juste après la création de l'URLConnection bien sur ...

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur cartographe
    Inscrit en
    Avril 2009
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 173
    Points : 4 224
    Points
    4 224
    Par défaut
    Perso, j'utilise ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import org.apache.commons.httpclient.*
    ...
    Du coup, faire du POST "reste" simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    PostMethod postM= new PostMethod(URL);
    postM.setRequestHeader(new Header("NOM","VALEUR");
    postM.setRequestEntity(new InputStreamRequestEntity(/* plein de façon de le faire ici !!*/));
    ...
    HttpClient c= new HttpClient();
    c.executeMethod(postM);
    int code= postM.getStatusCode();
    ...

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur cartographe
    Inscrit en
    Avril 2009
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 173
    Points : 4 224
    Points
    4 224
    Par défaut
    J'ai oublié ...
    On peut faire du GET aussi sur les services de géocodage, en url encodant dans un paramètre xls le corps du POST

    C'est comme ça que fait l'API Javascript pour ne plus avoir besoin de proxy

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. JSP Appel méthode JAVA
    Par maxime17s dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 04/06/2007, 11h59
  2. Réponses: 9
    Dernier message: 10/05/2007, 17h57
  3. Réponses: 1
    Dernier message: 12/02/2007, 15h22
  4. [PL/SQL]Appel d'une classe/méthode java
    Par marsup54 dans le forum SQL
    Réponses: 4
    Dernier message: 30/06/2004, 16h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo