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 :

commande curl data encode en Java


Sujet :

Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 139
    Par défaut commande curl data encode en Java
    bonjour à tous,

    je souhaite accéder à une API REST qui permet de récupérer un objet sauvegardé. voici la commande CURL:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    curl -X GET \
      -H "X-Parse-Application-Id: 1234" \
      -H "X-Parse-REST-API-Key: abdhchc" \
      -G \
      --data-urlencode 'where={"playerName":"Sean Plott","cheatMode":false}' \
      https://api.parse.com/1/classes/GameScore
    j'arrive bien à accéder à cette API REST mais je n'arrive pas à implémenter le --data-urlencode en Java...

    voici mon 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
     
    URL url = new URL("https://api.parse.com/1/classes/toto");
    					HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
     
    					conn.setDoOutput(true);
    					conn.setRequestMethod("GET");
    					conn.setRequestProperty("Content-Type", "application/json");
    					conn.setRequestProperty("X-Parse-Application-Id","1234");
    					conn.setRequestProperty("X-Parse-REST-API-Key","abdhchc");
     
    					String encoded = URLEncoder.encode( input , HTTP.UTF_8);
     
    					OutputStream os = conn.getOutputStream();
     
    					os.write(encoded.getBytes());
    					os.flush();
     
    					if (conn.getResponseCode() != HttpURLConnection.HTTP_CREATED) {
    						throw new RuntimeException("Failed : HTTP error code : "
    							+ conn.getResponseCode());
    					}
    j'ai tenté de rajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    mais j'ai toujours le même résultat, la commande me renvoit un HTTP 400....

    pourriez vous m'indiquer comment implémenter ce fameux --data-urlencode en java ?

    Merci !
    Tiamat.

    PS: ça marche bien en GET et en POST mais sans data-urlencode....donc je présume que ça vient d'un problème d'encodage de mes data....

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    D'après la doc, l'option --data-urlencode encode seulement la partie après le "=" : http://curl.haxx.se/docs/manpage.html#--data-urlencode

    Or dans ton code tu sembles encoder toute la chaine, ce qui fait que tu obtiens "where%3D%7B%22playerName%22%3A%22Sean+Plott%22%2C%22cheatMode%22%3Afalse%7D"
    au lieu de "where=%7B%22playerName%22%3A%22Sean+Plott%22%2C%22cheatMode%22%3Afalse%7D" ...



    Sinon attention à la manière dont tu écris les données, car tu utilises le charset par défaut du système et non pas l'UTF8.
    Selon me charset de l'OS cela pourrait produire des effets bizarres, et il vaut mieux le spécifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    os.write(encoded.getBytes("utf-8"));
     
    // ou avec Java 7 :
    os.write(encoded.getBytes(StandardCharsets.UTF_8));


    Et penses à libérer proprement les ressources !


    a++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 139
    Par défaut
    Salut adiGuba,

    merci de ta réponse.
    j'ai tenté de corriger ce problème d'encodage du where= avec le code ci dessous:

    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
     
    				String beg_input="'where=";
    				String input = "{\"nom\":\""+name+"\"}'";
     
    				try {
     
    					URL url = new URL("https://api.parse.com/1/classes/Patient");
    					HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
     
    					conn.setDoOutput(true);
    					conn.setRequestMethod("GET");
    					conn.setRequestProperty("Content-Type", "application/json");
    					conn.setRequestProperty("X-Parse-Application-Id","-------");
    					conn.setRequestProperty("X-Parse-REST-API-Key","*******");
    					//conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
     
     
    					String encoded = URLEncoder.encode( input , "UTF-8");
                                            System.out.println(beg_input+encoded);
    					OutputStream os = conn.getOutputStream();
    					os.write(beg_input.getBytes());
    					os.write(encoded.getBytes("UTF-8"));
    					os.flush();
     
    					if (conn.getResponseCode() != HttpURLConnection.HTTP_CREATED) {
    						throw new RuntimeException("Failed : HTTP error code : "
    							+ conn.getResponseCode());
    					}
    mais j'ai toujours un HTTP 400 en retour....

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Les simples quotes sont en trop !

    En ligne de commande cela permet de délimiter le paramètre, mais elle ne sont pas envoyée...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String beg_input="where=";
    String input = "{\"nom\":\""+name+"\"}";

    a++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 139
    Par défaut
    Effectivement j'avais tenté sans les simple quotes:

    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
     
    				String beg_input="where=";
    				String input = "{\"nom\":\""+name+"\"}";
     
    				try {
     
    					URL url = new URL("https://api.parse.com/1/classes/toto");
    					HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
     
    					conn.setDoOutput(true);
    					conn.setRequestMethod("GET");
    					conn.setRequestProperty("Content-Type", "application/json");
    					conn.setRequestProperty("X-Parse-Application-Id","****");
    					conn.setRequestProperty("X-Parse-REST-API-Key","*****");
    					conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
     
    					String encoded = URLEncoder.encode( input , HTTP.UTF_8);
     
    					String msg = beg_input+encoded;
    					System.out.println(msg);
    					OutputStream os = conn.getOutputStream();
    					os.write(msg.getBytes());
    					os.flush();
    mais j'ai toujours le même résultat...
    pour donner un élément de comparaison, voici un bout de code qui envoit bien un GET sur cette API mais avec un -data

    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
     
    					URL url = new URL("https://api.parse.com/1/classes/toto");
    					HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
     
    					conn.setDoOutput(true);
    					conn.setRequestMethod("GET");
    					conn.setRequestProperty("Content-Type", "application/json");
    					conn.setRequestProperty("X-Parse-Application-Id","*****");
    					conn.setRequestProperty("X-Parse-REST-API-Key","****");
     
    					String input = "{\"nom\":\""+nom+"\",\"val1\":\""+val1+"\",\"val2\":\""+val2+"\",\"val3\":\""+val3+"\"}";
     
    					System.out.println(input);
     
    					OutputStream os = conn.getOutputStream();
    					os.write(input.getBytes());
    					os.flush();
    en regardant la syntaxe demandée sur le --data-urlencode je ne vois vraiment pas de quoi ça peut venir....

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 576
    Par défaut
    Certainement à cause du GET. On ne peut pas envoyer de données avec GET, ça devrait être POST ou PUT.

    Apparemment curl considère que l'envoi de données annule l'option "-X GET" et passe à POST à la place.
    Java, lui, fait ce que tu lui demandes et essaie d'envoyer un GET avec des données... Et se fait envoyer paître par le serveur.

    Edit : je suis conscient que, du fait que le deuxième exemple marche, lui, et qu'il envoie bel et bien des données dans un GET, ça a pas l'air cohérent ce que je dis.
    Sauf que, c'est peut-être bien le serveur, qui a pris l'habitude de rejeter les application/x-www-form-urlencoded s'ils ne sont pas en POST, mais qui ne s'occupe pas de savoir si c'est GET ou POST ou que que ce soit avec les autres formes de données. Un cas très fréquent en PHP ou avec certains vieux frameworks Java, par exemple.
    Ce qu'il faut retenir, c'est que HTTP n'autorise pas à envoyer des données avec GET, donc il ne faut pas le faire. Mais les serveurs peuvent parfois s'en rendre compte et faire une erreur, et parfois non et l'accepter.

    Edit 2: une autre différence avec curl, c'est l'envoi de Content-Type: application/json alors que ça devrait être application/x-www-form-urlencoded. Et qu'il faut surtout qu'il n'y en ait qu'un seul.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 139
    Par défaut
    Merci thelvin de ton message,

    j'ai tenté de passer en POST et là toujours Erreur HTTP400 par contre en PUT j'ai une erreur de type 404 !

    donc soit le PUT n'est pas implémenté coté serveur (ce que je pense) soit mes data ne sont pas bonnes...j'ai tenté avec une autre commande data et j'ai aussi la même erreur.

    un vrai casse tête chinois !

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 139
    Par défaut
    juste une question bête....l'encodage demandé est bien UTF-8 ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 139
    Par défaut
    Après relecture de la doc curl, l'option -G dans la commande ci-dessous:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    curl -X GET \
      -H "X-Parse-Application-Id: 1234" \
      -H "X-Parse-REST-API-Key: abdhchc" \
      -G \
      --data-urlencode 'where={"playerName":"Sean Plott","cheatMode":false}' \
      https://api.parse.com/1/classes/GameScore
    force bien l'utilisation d'une commande GET. par contre j'ai tenté de remplacer le --data-urlencode avec la donnée qui du coup ne nécessite pas de formatage particulier et j'ai aussi une erreur 400.

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 576
    Par défaut
    Ah oui, j'avais pas vu le -G.

    Il force, certes, l'utilisation d'un GET. Mais d'une manière qui a du sens. En gros il prend les données application/x-www-form-urlencoded et les met après l'URL au lieu de les envoyer comme données.
    Autrement dit, il fait la même chose qu'un navigateur auquel on demande d'envoyer un formulaire en GET.

    Pour faire la même chose en Java, tu ne dois pas utiliser d'OutputStream ni de Content-Type. Tu dois juste faire en sorte que l'URL ait les paramètres après un ?

    Citation Envoyé par tiamat Voir le message
    juste une question bête....l'encodage demandé est bien UTF-8 ?
    Aucune importance tant qu'il n'y a pas d'accents ou autres caractères de ce genre. Mais en principe, oui, il faut de l'UTF-8. Sauf si le serveur ne respecte pas les normes.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tiamat Voir le message
    Après relecture de la doc curl, l'option -G dans la commande ci-dessous:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    curl -X GET \
      -H "X-Parse-Application-Id: 1234" \
      -H "X-Parse-REST-API-Key: abdhchc" \
      -G \
      --data-urlencode 'where={"playerName":"Sean Plott","cheatMode":false}' \
      https://api.parse.com/1/classes/GameScore
    force bien l'utilisation d'une commande GET.
    Cela envoi bien les données en GET, mais en respectant le protocole HTTP GET, c'est à dire en passant les données dans les paramètres de l'URL et non pas dans le flux de communication comme tu le fais !
    Source : http://curl.haxx.se/docs/manpage.html#-G

    Bref il faut passer ta chaine dans l'URL et non pas en POST :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		String query = "{\"playerName\":\"Sean Plott\",\"cheatMode\":false}";
    		URL url = new URL("https://api.parse.com/1/classes/GameScore?where=" + URLEncoder.encode(query, "utf8"));

    a++


    [edit] grillé

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 139
    Par défaut
    bien vu ;-)

    effectivement ça marche beaucoup mieux comme ça !

    merci pour votre aide

    Tiamat.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/07/2006, 10h40
  2. Comment lancer une ligne de commande dans un processus en Java.
    Par doyouknow56 dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 13/05/2006, 11h55
  3. Problème sur la commande COPY depuis un programme Java
    Par klereth dans le forum PostgreSQL
    Réponses: 10
    Dernier message: 10/02/2006, 14h14
  4. [débutant]lancement d'une commande Unix ou LInux depuis Java
    Par msiramy dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 30/09/2005, 18h10
  5. [VB6] Command dans Data Environnement
    Par damned3 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 02/09/2005, 09h39

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