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

Entrée/Sortie Java Discussion :

Problème de POST HTTP et de réponse


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 150
    Par défaut Problème de POST HTTP et de réponse
    Bonjour a tous,

    depuis une semaine déjà je rame un peu et malgré plusieurs recherche je n'arrive pas a résoudre mon souci.
    en gros voila, de bric et de broc j'essaie en vain de faire une requête http post sur un site afin de recuperer des informations (ici des NOTAMs terrains pour ce qui connaisse l'aéronautique )

    Quand j'effectue cette demande par le site postman, j'arrive a obtenir les infos que je souhaite.
    quand je transpose et code cette requete en java via NETBEANs IDE 11.1, je n'arrive pas a obtenir ce que je veux.

    je précise que je souhaite le résultat sous forme de xml pour plus tard le traiter et en extraire juste les infos finales.

    pourriez vous me dire ce qui ne va pas dans mon code s'il vous plait?

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
     
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package httpsrequesttest;
     
    import java.io.BufferedReader;
    //import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import javax.net.ssl.HttpsURLConnection;
    import java.net.URL;
     
    public class HttpURLConnectionExample {
     
    	//private static final String USER_AGENT = "google";
            private static final String ICAO = "LFBO LFMK";
            private static final String REPORTTYPE = "Raw";
            private static final String ACTIONTYPE = "notamRetrievalByICAOs";
            private static final String BUTTON = "Check All NOTAMs";
            private static final String SUBMIT = "View NOTAMs";
     
    	private static final String POST_URL = "https://www.notams.faa.gov/dinsQueryWeb/queryRetrievalMapAction.do";
     
    	private static final String POST_PARAMS = "POST";
     
    	public static void main(String[] args) throws IOException {
     
    		sendPOST();
    		System.out.println("POST DONE");
    	}
     
    	private static void sendPOST() throws IOException {
    		URL obj = new URL(POST_URL);
    		HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
    		con.setRequestMethod("POST");
    		//con.setRequestProperty("User-Agent", USER_AGENT);
                    con.setRequestProperty("retrieveLocId", ICAO );
                    con.setRequestProperty("reporType", REPORTTYPE );
                    con.setRequestProperty("actionType", ACTIONTYPE );
                    con.setRequestProperty("button", BUTTON );
                    con.setRequestProperty("submit", SUBMIT );
                    con.
     
    		// For POST only - START
    		con.setDoOutput(true);
                try //(DataOutputStream os = new DataOutputStream( con.getOutputStream())) {
                    // wr.write(POST_PARAMS);
     
     
     
                    (OutputStream os = con.getOutputStream()) {
                    os.write(POST_PARAMS.getBytes());
                    //os.flush();
                    // For POST only - END
                }
     
    		int responseCode = con.getResponseCode();
    		System.out.println("POST Response Code :: " + responseCode);
     
    		if (HttpsURLConnection.HTTP_OK == responseCode) { 			StringBuffer response;
                    try ( //success
                            BufferedReader in = new BufferedReader(new InputStreamReader(
                                    con.getInputStream()))) {
                        String inputLine;
                        response = new StringBuffer();
                        while ((inputLine = in.readLine()) != null) {
                            response.append(inputLine);
                        }
                    }
     
                    //print result
                    System.out.println(response.toString());
                    } else {
                        System.out.println("POST request not worked");
                    }
    	}
     
        void sendGet() {
            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }
     
        void sendPost() {
            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }
     
    }
    il me sort bien un résultat mais pas ce que je souhaite.

    J'ai pourtant bien inspecter la page web pour en récupérer les bonnes "KEY" et "VALUE" mais je pense que j'ai zappé une code.

    Par avance merci pour votre aide.

    Amicalement

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Cela me semble plus être un problème de requête par rapport à ce que le site traite que de Java. Encore que dans ton code, les paramètres sont mal transmis. En tout cas la réponse obtenue est du html pas du xml... La réponse que tu obtiens sous postman est du xml ? Est-ce que tu peux nous montrer la requête faite sous postman, en curl par exemple.

    Pour le passage de paramètres, il faut les passer dans le body en application/x-www-form-urlencoded et surtout préciser le Content-Length. setRequestProperty c'est pour passer des headers, pas des paramètres.

    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 void post(HttpURLConnection con, Map<String, Object> parameters, Charset charset) throws IOException {
     
    		con.setRequestMethod("POST");
    		StringBuilder postdata = new StringBuilder();
    		for (Map.Entry<String, Object> parameter : parameters.entrySet() ) {
    			if (postdata.length() != 0) {
    				postdata.append('&');
    			}
    			postdata.append(URLEncoder.encode(parameter.getKey(), charset));
    			postdata.append('=');
    			postdata.append(URLEncoder.encode(String.valueOf(parameter.getValue()), charset));
    		}
    		byte[] content = postdata.toString().getBytes(charset); 
    		con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    		con.setRequestProperty("Content-Length", String.valueOf(content.length));
    		con.setDoOutput(true);
    		try (OutputStream outputstream = con.getOutputStream()) {
    			outputstream.write(content);
    		}
     
    	}
    Et pour l'appeler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Map<String,Object> parameters = new LinkedHashMap<>();
    		parameters.put("retrieveLocId", ICAO);
    		parameters.put("reporType", REPORTTYPE);
    		parameters.put("actionType", ACTIONTYPE);
    		parameters.put("button", BUTTON);
    		parameters.put("submit", SUBMIT);
    		post(con,parameters,StandardCharsets.ISO_8859_1);
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 150
    Par défaut
    bonsoir Joel,

    tout d'abord merci de prendre le temps de me repondre.
    ci-dessous le requete envoyée depuis postman en curl comme demandé.

    par la suite peux- me dire ou je dois placer les parties de codes que tu as joins dans ta réponse? car qd j'essai il me retourne une erreur. (pardonne moi je suis super novice et j'apprends au coup par coup

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    curl -X POST \
      https://www.notams.faa.gov/dinsQueryWeb/queryRetrievalMapAction.do \
      -H 'Content-Type: text/plain' \
      -H 'Postman-Token: 0d450bc8-84fd-4e91-96fa-8ba5d313f15c' \
      -H 'cache-control: no-cache' \
      -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
      -F retrieveLocId=lfbo \
      -F reportType=Raw \
      -F actionType=notamRetrievalByICAOs

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par K2carca Voir le message
    peux- me dire ou je dois placer les parties de codes que tu as joins dans ta réponse?
    Voici ton code, où j'ai surligné les parties que j'ai modifiées (ajout de mon code et mise en commentaire du tien en trop) :

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
     
     
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package httpsrequesttest;
     
    import java.io.BufferedReader;
    //import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import javax.net.ssl.HttpsURLConnection;
    import java.net.URL;
    
    import java.net.URLEncoder;
    import java.nio.charset.Charset;
    import java.nio.charset.StandardCharsets;
    import java.util.LinkedHashMap;
    import java.util.Map;
     
    public class HttpURLConnectionExample {
     
    	//private static final String USER_AGENT = "google";
            private static final String ICAO = "LFBO LFMK";
            private static final String REPORTTYPE = "Raw";
            private static final String ACTIONTYPE = "notamRetrievalByICAOs";
            private static final String BUTTON = "Check All NOTAMs";
            private static final String SUBMIT = "View NOTAMs";
     
    	private static final String POST_URL = "https://www.notams.faa.gov/dinsQueryWeb/queryRetrievalMapAction.do";
     
    	//. private static final String POST_PARAMS = "POST";
     
    	public static void main(String[] args) throws IOException {
     
    		sendPOST();
    		System.out.println("POST DONE");
    	}
     
    	private static void sendPOST() throws IOException {
    		URL obj = new URL(POST_URL);
    		HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
    		/*con.setRequestMethod("POST");
    		//con.setRequestProperty("User-Agent", USER_AGENT);
                    con.setRequestProperty("retrieveLocId", ICAO );
                    con.setRequestProperty("reporType", REPORTTYPE );
                    con.setRequestProperty("actionType", ACTIONTYPE );
                    con.setRequestProperty("button", BUTTON );
                    con.setRequestProperty("submit", SUBMIT );
                    con. 
     
    		// For POST only - START
    		con.setDoOutput(true);
                try //(DataOutputStream os = new DataOutputStream( con.getOutputStream())) {
                    // wr.write(POST_PARAMS);
     
     
     
                    (OutputStream os = con.getOutputStream()) {
                    os.write(POST_PARAMS.getBytes());
                    //os.flush();
                    // For POST only - END
                }*/
     
                    
                    Map<String,Object> parameters = new LinkedHashMap<>();
    		parameters.put("retrieveLocId", ICAO);
    		parameters.put("reporType", REPORTTYPE);
    		parameters.put("actionType", ACTIONTYPE);
    		parameters.put("button", BUTTON);
    		parameters.put("submit", SUBMIT);
    		post(con,parameters,StandardCharsets.ISO_8859_1);
                    
    
    		int responseCode = con.getResponseCode();
    		System.out.println("POST Response Code :: " + responseCode);
     
    		if (HttpsURLConnection.HTTP_OK == responseCode) { 			StringBuffer response;
                    try ( //success
                            BufferedReader in = new BufferedReader(new InputStreamReader(
                                    con.getInputStream()))) {
                        String inputLine;
                        response = new StringBuffer();
                        while ((inputLine = in.readLine()) != null) {
                            response.append(inputLine);
                        }
                    }
     
                    //print result
                    System.out.println(response.toString());
                    } else {
                        System.out.println("POST request not worked");
                    }
    	}
    
        
    
        
    public static void post(HttpURLConnection con, Map<String, Object> parameters, Charset charset) throws IOException {
     
    		con.setRequestMethod("POST");
    		StringBuilder postdata = new StringBuilder();
    		for (Map.Entry<String, Object> parameter : parameters.entrySet() ) {
    			if (postdata.length() != 0) {
    				postdata.append('&');
    			}
    			postdata.append(URLEncoder.encode(parameter.getKey(), charset));
    			postdata.append('=');
    			postdata.append(URLEncoder.encode(String.valueOf(parameter.getValue()), charset));
    		}
    		byte[] content = postdata.toString().getBytes(charset); 
    		con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    		con.setRequestProperty("Content-Length", String.valueOf(content.length));
    		con.setDoOutput(true);
    		try (OutputStream outputstream = con.getOutputStream()) {
    			outputstream.write(content);
    		}
    
    	}
        
    
        void sendGet() {
            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }
     
        void sendPost() {
            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }
    }
    Il est important d'appeler la méthode post() après avoir passé tous les headers (appel de setRequestProperty) et de ne plus rien écrire après.

    Citation Envoyé par K2carca Voir le message
    ci-dessous le requete envoyée depuis postman en curl comme demandé.
    Tu ne m'as pas dit si tu recevais bien du XML sous postman. Parce que les spécificités tu cas n'expliquent pas que tu obtiennes du XML alors que j'obtiens du HTML. Bon, ce curl me semble un peu foireux, mais ça c'est postman, bien qu'il fonctionne et qu'il me renvoit du HTML ! Pareil si je transmets mes paramètres en multipart/formdata en Java...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 150
    Par défaut
    il me dit "incompatible types: Charset cannot be be converted to String"
    Dois je remplacer charset (souligné dans le code par un autre élément ?

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Tu as dû modifier le code en recopiant...

    Ici le type de charset est java.nio.charset.Charset
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static void post(HttpURLConnection con, Map<String, Object> parameters, Charset charset) throws IOException {
    Dans l'appel, le type est compatible : post(con,parameters,StandardCharsets.ISO_8859_1);Dans les invocations qui utilisent le paramètre, idem :
    1. postdata.append(URLEncoder.encode(parameter.getKey(), charset));
    2. postdata.append(URLEncoder.encode(String.valueOf(parameter.getValue()), charset))
    3. byte[] content = postdata.toString().getBytes(charset);


    Donc si l'exemple a été copié fidèlement tu ne peux pas avoir cette erreur...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/11/2017, 08h02
  2. [NDK] JAVA HTTP POST + réponse
    Par Benmaster1 dans le forum Android
    Réponses: 2
    Dernier message: 05/03/2014, 18h13
  3. JAVA Android HTTP POST
    Par Benmaster1 dans le forum Android
    Réponses: 6
    Dernier message: 04/03/2014, 16h53
  4. [XCode] how to send HTTP Post Request with parameters?
    Par SALMAENIT dans le forum XCode
    Réponses: 0
    Dernier message: 03/04/2012, 17h53
  5. Java & Http POST
    Par zentro dans le forum Général Java
    Réponses: 0
    Dernier message: 20/05/2010, 12h43

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