2009-12-12 11 views
1

J'ai une syntaxe boucle dans le fichier .sh. Je dois exécuter le sytnax boucle ou commande curl en Java reproduisant la même syntaxe, mais je suis face à problème en reproduisant la même.simulation de syntaxe Curl en Java

$AUTH_OPTION="--basic -u testuser:testpwd" 
$HTTP_METHOD=POST 
$FILE_OPTION="-d @$INPUT_FILE" 
$CONTENT_TYPE="application/xml" 
$ACCEPT_TYPE="application/xml" 

echo curl -o response.txt -w %{http_code} -k -v $AUTH_OPTION -X $HTTP_METHOD $FILE_OPTION -H \"Content-Type: $CONTENT_TYPE\" -H \"Accept: $ACCEPT_TYPE\" 

J'ai le code Java correspondant comme:

StringBuffer curlCmd=new StringBuffer(); 
curlCmd.append("curl -o response.txt"); 
curlCmd.append(WHITE_SPACE); 
curlCmd.append("-w %{http_code}"); 
curlCmd.append("-k -v -u testuser:testpwd"); 
curlCmd.append(WHITE_SPACE); 
curlCmd.append("-X POST"); 
curlCmd.append(WHITE_SPACE); 
curlCmd.append("-d @/test/xyz/xml"); 
curlCmd.append(WHITE_SPACE); 
curlCmd.append("-H"+"Content-type: application/xml"); 
curlCmd.append(WHITE_SPACE); 
curlCmd.append("-H"+" Accept: application/xml"); 
curlCmd.append(WHITE_SPACE); 

Cela ne semble pas fonctionner: son ne simule pas le même comportement de syntaxe .sh boucle. Quelqu'un peut-il m'aider à résoudre ce problème?

sortie boucle -o response.txt -w% {} HTTP_CODE -k -v -u testuser: testpwd -X POST -d @/chemin/xyz.xml -H "Content-Type: application/xml" -H « Accepter: application/xml » le problème est xml ne reçoit pas accéder correctement

+0

Qu'est-il arrivé à '--basic'? –

+0

J'ai aussi utilisé --basic mais cela ne semble pas fonctionner – sarah

+0

Post le résultat de 'echo curl -o réponse.txt -w% {code_code} -k -v $ AUTH_OPTION -X $ HTTP_METHOD $ FILE_OPTION -H \ "Content-Type: $ CONTENT_TYPE \" -H \ "Accepter: $ ACCEPT_TYPE \" 'et' System.out (curlCmd.toString()); ' –

Répondre

0

Je pense qu'il ya quelques problèmes possibles, mais qui attire mon attention est que vous manquez des guillemets autour Content-Type: $CONTENT_TYPE et Accept: $ACCEPT_TYPE, pour exemple:

"-H \"Content-type: application/xml\"" 

Une deuxième erreur est que vous avez écrit -d @/test/xyz/xml mais il devrait être :

-d @/test/xyz.xml 

Si cela ne fonctionne toujours pas, vous pouvez poster la sortie des deux le script sh et votre StringBuffer afin que nous puissions voir plus facilement où les différences sont?

+0

J'ai utilisé la syntaxe comme vous l'avez dit, mais le problème persiste. Je reçois l'erreur badrequest, j'essaye d'exécuter ce programme dans Linux en utilisant l'API d'exécution – sarah

+0

Je pense que vous devriez au lieu d'exécuter la commande, essayez de l'afficher à System.out ou l'afficher dans un débogueur. Il est probablement tout à fait évident ce qui ne va pas si vous faites cela. Sinon, postez la chaîne que vous avez ici et quelqu'un vous montrera rapidement ce qu'il faut corriger. Nous ne pouvons pas vraiment vous aider si vous nous dites simplement "Ça ne marche pas". –

+0

Je ne reçois pas exactement la syntaxe correcte de curl à utiliser dans java .., la sortie que je reçois comme la syntaxe suivante curl -o response.txt -w% {http_code} -k -v -X POST -d @/path/xyz.xml -H "Type de contenu: application/xml" -H "Accept: application/xml" – sarah

0

Vous devez probablement remplacer %{http_code} par autre chose sur la ligne 4 du code Java. Les variables d'environnement ne seront pas interpolées par Java.

Aussi, jetez un oeil à la méthode Runtime#exec. Cela vous permet d'exécuter des commandes sans avoir à vous soucier d'échapper des citations et autres.

Il est probablement une bonne idée de vous assurer que votre commande est exécutée sans problèmes (tels que le serveur ne pas accepter le contenu affiché) avant d'essayer de déboguer l'invocation de java. Il est beaucoup plus facile de traiter un problème à la fois.

+0

J'ai la même commande d'exécution pour exécuter, mais la sortie est mauvaise. – sarah

+0

Sarah, vous devez remplacer 'http_code' car c'est une variable d'environnement! Ou utilisez 'System.getenv (" http_code ")'. – Geo

+0

ok mais quelle devrait être la valeur de http_code? – sarah

0

Si vous utilisez des variables d'environnement, alors vous devez vous assurer que:

  1. ils sont exported
  2. vous exécutez curl via un shell (par exemple /bin/bash)

Les moyens exportateurs que les variables sont exposées aux processus enfants. L'exécution du shell les développera avant d'appeler votre exécutable.

donc votre appel ressemblera à ceci:

sh curl .... 

Il serait utile de voir comment vous invoquez Process.exec(). Une Gotcha commune est que vous devez consommer le stdout/stderr du processus en même temps, sinon votre processus sh/curl peut bloquer l'attente de votre processus parent pour consommer la sortie. Voir here pour plus de détails.

+0

okay, maintenant je n'utilise pas de variables d'environnement ..., avons-nous besoin d'exécuter curl en utilisant cette syntaxe sh curl ... curl lui-même est une commande, pourquoi nous avons besoin sh? – sarah

+0

Si vous n'utilisez pas de variables d'environnement, vous n'avez pas besoin de/bin/bash. Le shell va développer toutes les variables d'environnement que vous référenciez sur la ligne de commande, donc si vous n'utilisez pas, alors exécuter curl seul sera parfait. Mes commentaires re. la concurrence reste cependant! –