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

Java Discussion :

Récupérer la réponse d'une adresse HTTP


Sujet :

Java

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Par défaut Récupérer la réponse d'une adresse HTTP
    Bonjour.
    Existe-il une méthode en java pour récupérer des données provenant une adresse http variable ?
    Par exemple, l'adresse "http://domaine/dossier/var1", où var1 est une variable de type char dont la valeur est définie dans le code java. Cette adresse http renvoie une réponse au format texte.
    Quelle méthode utiliser dans le code java pour lire et traiter cette réponse ?
    Je vous remercie.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Il n'y a pas de protocole prédéfini ni connu pour, en HTTP, renvoyer des "variables de type char dont la valeur est définie dans le code Java."

    Le plus simple serait de nous montrer ce que cette adresse renvoie exactement.

    Pour lire le contenu d'une URL, ceci peut faire l'affaire (adaptable si nécessaire) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public String readURL(String url) throws IOException {
      try(InputStream is = new URL(url).openConnection().getInputStream()) {			
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"));
     
        StringBuilder builder = new StringBuilder();
        for(String line = reader.readLine(); line != null; line = reader.readLine()) {
          builder.append(line + "\n");
        }
        return builder.toString();
      }
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Par défaut
    Merci pour votre réponse.
    L'adresse http renvoie une réponse au format JSON. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [{"label": "Confiture", "uri": "id:1.1:2.2"}, {"label": "Fromage", "uri": "id:1.7:3.2"}, {"label": "Beurre", "uri": "id:5.3:4.8"}]
    Le contenu de cette réponse sera différent selon la valeur var1 de la variable dans l'adresse "http://domaine/dossier/var1".
    En résumé : un champ de saisie permet à l'utilisateur d'entrer une valeur pour "var1", et un bouton 'valider' permet d'envoyer la requête "http://domaine/dossier/var1". Enfin, un tableau récupère le résultat (la réponse au format JSON) de la requête http, et affiche à l'utilisateur un des "label" de la réponse par exemple.
    Est-ce faisable avec URL url = new URL("adresse") ?

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    la première partie se fait sans problème avec un URL. Par contre, décoder la réponse (JSON) doit se faire soit à la main, soit avec un librairie tierce.

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Par défaut
    Sans tenir compte de la variable var1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    URLConnection connexion = null;
    URL url = new URL("http://domaine/dossier/");
    connexion = url.openConnection();
    Comment faire pour que le new URL prenne en compte "var1" ?

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    URL url = new URL("http://domaine/dossier/"+var1);
    Tout simplement (si ce que tu nous a décrit est correct)

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Par défaut
    Le code suivant fonctionne, mais il ne fait rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Char var1= 'i';
    URLConnection connexion = null;
    URL url;
    try {
    	url = new URL("http://domaine/dossier/"+var1);
    	connexion = url.openConnection();
    	} catch (Exception e) {
    	// TODO Auto-generated catch block
    	e.printStackTrace();
            }
    Que manque-t-il pour avoir la réponse (le contenu renvoyé par la requête) dans un tableau ?

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Par défaut
    La méthode getInputStream() ne marche pas.
    Le code suivant lève une exception une fois arrivée à la ligne de la méthode getInputStream() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    URL url = new URL("http://domaine/dossier/"+var1);
    connexion = url.openConnection();
    InputStream is = connexion.getInputStream();
    Que faut-il faire ?

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Laisse-moi deviner, java.net.UnknownHostException ?

    C'est un peu normal puisque http://domaine n'existe pas... Il faut mettre la vraie URL bien sûr.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Citation Envoyé par Davesique Voir le message
    Que faut-il faire ?
    Lire le message d'erreur dans l'exception

  11. #11
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Par défaut
    le message d'erreur dans l'exception est le suivant :
    java.net.SocketException: Permission denied
    Que cela signifie-t-il ?

  12. #12
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Qu'il va nous falloir, non seulement la première ligne du message d'erreur, mais aussi toutes les lignes du message d'erreur.

    Peut être utile aussi de nous parler de l'environnement sur lequel tu travailles, il a peut-être ses limitations.

    Enfin, en général c'est le signe que tu bosses sur Android et n'a pas demandé la permission d'accès réseau, ou bien que tu es dans une applet et que tu essaies d'accéder à une URL qui n'est pas sur le même domaine que l'applet.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Par défaut
    En effet, je suis sous Android.
    C'est la seule ligne du message d'erreur que j'obtiens en étant en mode debug (et Step Over).
    Comment vérifier la permission d'accès réseau ?

  14. #14
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Par défaut
    Même en ajoutant le droit d'accès cela ne marche toujours pas.
    Dans le fichier Manifest.xml la ligne suivante est ajoutée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    android:permission="android.permission.INTERNET"
    Mais le message d'erreur "java.net.SocketException: Permission denied" persiste toujours.
    Pourquoi ?

  15. #15
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Par défaut
    Cela fonctionne enfin, c'était la ligne android:permission="android.permission.INTERNET" qui était mal positionnée dans le Manifest.xml.
    Mais la suite pose un nouveau problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    InputStream is = connexion.getInputStream();
    reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder builder = new StringBuilder();
    for(String line = reader.readLine(); line != null; line = reader.readLine())
       {
        builder.append(line + "\n");
       }
    String readurl = builder.toString();
    Le résultat obtenu par "reader.readLine()" est "[]", et le string readurl ne contient à la fin que ces deux crochets.
    Or, l'adresse http renvoie la réponse suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [{"label": "Confiture", "uri": "id:1.1:2.2"}, {"label": "Fromage", "uri": "id:1.7:3.2"}, {"label": "Beurre", "uri": "id:5.3:4.8"}]
    Manque-t-il quelque chose dans le code pour pallier à ce problème ?

  16. #16
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    En principe tout est bon. Mais le serveur fait peut-être de la discrimination (volontaire ou non) contre le client HTTP Android. Il faudrait que tu nous donnes la vraie URL pour qu'on puisse faire des tests.

    Ma première idée serait de comparer
    - les headers http du navigateur
    - les headers http du client android

    - voir si ça change quelque chose si le navigateur envoie les mêmes headers que le client android
    - voir si ça change quelque chose si le client android envoie les mêmes headers que le navigateur
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  17. #17
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Par défaut
    La vraie URL est la suivante :
    https://timereader.herokuapp.com/api...utocomplete/ch
    Comment faire pour comparer les headers http ?
    Merci.

  18. #18
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Je constate que ce serveur renvoie [] quand on lui demande https://timereader.herokuapp.com/api/stations/autocomplete/var1 ou quoi que ce soit qui ne finit pas par /ch.

    Du coup je me dis que ton code Java ne construit peut-être pas bien l'URL. On peut pas savoir, il faudrait voir ce code. Un System.out.println() de cette URL permettrait d'en être plus sûr.

    Comment faire pour comparer les headers http ?
    Vu que c'est du https, ça va être compliqué. Tu peux utiliser l'extension Firefox Live HTTP Headers pour voir les headers envoyés par Firefox. Et tu peux utiliser Modify Headers pour voir ce que ça donne si tu enlèves des headers ou que tu mets n'importe quoi.

    Mais je pense plutôt que l'URL appelée par ton code n'est pas la bonne.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  19. #19
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Je constate que ce serveur renvoie [] quand on lui demande https://timereader.herokuapp.com/api/stations/autocomplete/var1 ou quoi que ce soit qui ne finit pas par /ch.
    Chez moi pour tant, a , i etc marchent. Ca fait de l'autocompletion sur une liste de noms.


    Pour le reste, affiche nous l'url générée par ton code, je suis sur qu'il doit y avoir un espace en trop quelque part

  20. #20
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Par défaut
    La variable var1 est issue d'un champ de saisie de type EditText.
    Le code dans l'activity.xml :
    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
    <EditText
            android:id="@+id/var1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="69dp"
            android:ems="10" >
            <requestFocus />
        </EditText>
    <Button
            android:id="@+id/Valid"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="53dp"
            android:layout_marginTop="76dp"
            android:text="Button" />
    Le code dans l'activity.java
    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
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity);
    		var1= (EditText)findViewById(R.id.var1);
    		valid = (Button)findViewById(R.id.Valid);
    		valid.setOnClickListener(validListener);
                    }
    private OnClickListener validListener = new OnClickListener() {
    		    @Override
    		    public void onClick(View v) {
    		    	URLConnection connexion = null;
                        URL url;
    		    try {
    		    url = new URL("https://timereader.herokuapp.com/api/stations/autocomplete/"+var1);
    		    connexion = site.openConnection();
    		    connexion.setDoOutput(true);
                        InputStream is = connexion.getInputStream();
    		    reader = new BufferedReader(new InputStreamReader(is));
    	            StringBuilder builder = new StringBuilder();
    		    for(String line = reader.readLine(); line != null; line = reader.readLine()) {
    			builder.append(line + "\n");
    			}
    		String readurl = builder.toString();
    		} catch (Exception e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    		}
                    }
    };
    La variable var1 est-elle mal déclarée ?

Discussions similaires

  1. Récupérer la réponse d'une console DOS
    Par twixi dans le forum VB.NET
    Réponses: 3
    Dernier message: 21/07/2008, 06h19
  2. Récupérer la réponse d'un serveur http
    Par dibiz dans le forum Langage
    Réponses: 4
    Dernier message: 19/05/2008, 19h01
  3. Récupérer le résultat d’une requête http
    Par f_in_afyn dans le forum Langage
    Réponses: 2
    Dernier message: 27/01/2007, 18h41
  4. [Mail] Récupérer le domaine d'une adresse mail
    Par Iro87 dans le forum Langage
    Réponses: 5
    Dernier message: 14/12/2006, 21h49
  5. Récupérer la valeur d'une adresse hexa 300.
    Par Cochman dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 04/06/2005, 18h45

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