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 :

Requêtes HTTP avec java.nio


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 124
    Par défaut Requêtes HTTP avec java.nio
    Bonjour,

    J'aurai besoin d'un petit coup de main car je ne comprend pas pourquoi ce code ne marche pas.
    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
     
    	/* variable globale de ma classe */
    	static private String adr;
    	static private int port;
    	static private SocketChannel sockChan;
    	static private InetSocketAddress remote;
    	static private ByteBuffer buffReq;
    	static private StringBuffer sb;
    	static private Path pathFichierRep;
     
    	/* Méthode de connexion au serveur */
    	public static boolean seConnecter(String adr, int port) throws IOException {
    		remote = new InetSocketAddress(adr, port);
    		sockChan = SocketChannel.open(remote);
    		return sockChan.isOpen();
    	}
     
    	/* Méthode d'envoi d'une requete http enregistrée dans un fichier texte */
    	public static int sendRequeteFromFile(String path) throws IOException {
    		int tailleChan = -1;
     
    		if (sockChan.isOpen()) {
    			FileChannel in = null; // canal d'entrée		    
    			try {
    				/* ouverture et lecture du fichier vers le buffer */
    				in = FileChannel.open(FileSystems.getDefault().getPath(path), StandardOpenOption.READ);
    				tailleChan = new Long(in.size()).intValue();
    				buffReq = ByteBuffer.allocate(tailleChan);
    				in.read(buffReq);
     
    				String req = new String(buffReq.array());
    				System.out.println(req);
     
    				buffReq = ByteBuffer.wrap(req.getBytes("US-ASCII"));
     
    				sockChan.write(buffReq);
    			} finally {
    				if(in != null) {
    					in.close();
    				}
    			}
    		}
     
    		return tailleChan;
    	}
    Je m'explique...

    Mon objectif est d'envoyer une requête GET, POST... à un serveur HTTP et de récupérer la réponse dans un 2e temps.

    Lorsque j'envoie une requête avec cette méthode, je reçois comme réponse du serveur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    HTTP/1.1 408 Request Time-out
    Date: Wed, 30 Oct 2013 15:25:52 GMT
    Server: Apache
    Vary: Accept-Encoding
    Content-Length: 21
    Connection: close
    Content-Type: text/html; charset=iso-8859-1
     
    HTTP_REQUEST_TIME_OUT
    Alors que si je modifie mon code avec la ligne ci-dessous, je reçois une réponse correcte du serveur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String req = "GET ma requete get";
    Je n'arrive pas à trouver de solution à mon problème. J'ai pourtant essayé plusieurs méthodes :
    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
    	public static int sendRequeteFromFile(String path) throws IOException {
    		int tailleChan = -1;
     
    		if (sockChan.isOpen()) {
    			FileChannel in = null; // canal d'entrée
    			try {
    				/* ouverture et lecture du fichier vers le buffer */
    				in = FileChannel.open(FileSystems.getDefault().getPath(path), StandardOpenOption.READ);
    				tailleChan = new Long(in.size()).intValue();
     
    				in.transferTo(0, tailleChan, sockChan);
    			} finally {
    				if(in != null) {
    					in.close();
    				}
    			}
    		}
     
    		return tailleChan;
    	}
    Même résultat!

    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
    	public static int sendRequeteFromFile(String path) throws IOException {
    		int tailleChan = -1;
     
    		if (sockChan.isOpen()) {
    			FileChannel in = null; // canal d'entrée
    			try {
    				/* ouverture et lecture du fichier vers le buffer */
    				in = FileChannel.open(FileSystems.getDefault().getPath(path), StandardOpenOption.READ);
    				tailleChan = new Long(in.size()).intValue();
     
    				buffReq = ByteBuffer.allocate(tailleChan);
    				in.read(buffReq);
    				buffReq.flip();
     
    				sockChan.write(buffReq);
    			} finally {
    				if(in != null) {
    					in.close();
    				}
    			}
    		}
    Même résultat!

    Je ne comprends vraiment pas pourquoi ça ne marche pas.
    Est-ce que quelqu'un aurait une solution s'il vous plait ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 124
    Par défaut
    D'après les recherche que j'ai fait sur mon sujet, ce serait un problème d'encodage/décodage du fichier. J'ai donc changé l'encodage du fichier et du buffer, mais il y a toujours un problème.

    J'ai essayé avec notepad++ de faire Encodage >>> Encoder en ANSII ou >>> Encoder en UTF-8.
    Puis après avoir transformé le buffer en String, j'ai encodé ce String en "US-ASCII" ou "UTF-8" avant de l'envoyer.
    Exemple d'encodage du buffer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String req = new String(buffReq.array());
    System.out.println(req);
    buffReq = ByteBuffer.wrap(req.getBytes("US-ASCII"));

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par DavidleVrai Voir le message
    Puis après avoir transformé le buffer en String, j'ai encodé ce String en "US-ASCII" ou "UTF-8" avant de l'envoyer.
    Exemple d'encodage du buffer :
    Ça n'a pas de sens.
    Ton fichier tu dois l'envoyer tel que. Des String n'ont rien à faire là-dedans, envoie directement ton array.

    Mais bon, le problème n'est pas forcément là. Moi j'ai zéro problème, donc le soucis est soi dans le fichier, celui que tu ne nous as pas montré, soit dans le serveur, celui dont tu ne nous as pas parlé.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 124
    Par défaut
    Merci de ta réponse. Le serveur distant est un site web. Je ne peux pas en dire plus mais le problème ne vient pas de là étant donné que j'ai testé ma requête sans la stocker dans un fichier et elle fonctionne.

    J'ai mis ma requête sous forme d'un string pour pouvoir l'afficher. Mais de toute manière j'ai essayé d'envoyer la requête directement après le buffer.read() mais ça ne marche pas non plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    buffReq = ByteBuffer.allocate(tailleChan);
    in.read(buffReq);
    buffReq.flip();
    System.out.println(new String(buffReq.array()));
    sockChan.write(buffReq);
    Je vais me pencher sur la piste du fichier.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 124
    Par défaut
    En effet c'était bien un problème de fichier. J'ai recréée le fichier et maintenant tout fonctionne.

    Merci beaucoup thelvin! Sujet résolu.

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

Discussions similaires

  1. Script de requêtes HTTP avec paramètre en boucle
    Par padsalad dans le forum Langage
    Réponses: 3
    Dernier message: 30/06/2009, 16h46
  2. Requête http avec retour XML
    Par safisafi dans le forum ASP.NET
    Réponses: 2
    Dernier message: 19/05/2009, 15h55
  3. tester le HTTPS avec java dans un Mobile
    Par roujij dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 27/04/2009, 12h55
  4. Problème requête HTTP avec caméra IP
    Par Sleeping Lionheart dans le forum Bibliothèques
    Réponses: 7
    Dernier message: 28/02/2009, 21h25
  5. Faire une requête https avec une application Delphi 7
    Par davidkungfu dans le forum Web & réseau
    Réponses: 12
    Dernier message: 10/04/2008, 10h39

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