Service Web Java: boucle ou URLConnection

j'utilise un serveur Java qui expose une API RESTful à L'URL suivante:

http://localhost:8080/my-server/

les docs recommandent d'utiliser curl pour soumettre des requêtes simples PUT (téléchargement de fichiers), et recommandent fortement aux utilisateurs d'utiliser les mêmes arguments que ceux fournis dans les exemples. Tous les exemples ressemblent à ceci:

curl -X PUT -f -u admin:password --data-binary @/absolute/path/file/to/upload/file.ext "http://localhost:8080/my-server/file.ext"

ce serveur ne fonctionnera pas avec FTP ou tout autre protocole de transfert normal.

j'ai trouvé ce question DONC, où la réponse-er recommandé à l'aide de java.net.URL et de son compagnon java.net.URLConnection au lieu d'essayer de travailler avec curl/libcurl.

Je n'ai jamais lancé de commande curl avant, donc je demande à quiconque connaît à la fois curl et Java si URL/URLConnection (ou tout autre framework Java) peut être utilisé au lieu de curl pour mon problème spécifique ici. Si non, alors je vais rédiger un composant qui exécute commandes à partir de la ligne de commande locale/terminal, puis exécuter la commande curl ci-dessus à l'intérieur de ce composant, et qui se sent juste laid/méchant.

si je peux accomplir la même chose dans une API réseau Java, je préférerais le faire de cette façon.

et, si cela peut être fait en Java, comment utiliser URL/URLConnection pour configurer le exact mêmes arguments de commande que l'exemple que j'ai fourni? Plus précisément:

  • -X
  • PUT
  • -f
  • -u admin:password
  • --data-binary
  • -@absolute/path/...

merci à l'avance pour toute perspicacité ici ou des coups de coude dans la bonne direction!

4
demandé sur Community 2012-02-28 21:50:44

3 réponses

je crois que C'est plus ou moins équivalent en utilisant Java et :

try {
    Credentials credentials = new UsernamePasswordCredentials("admin", "password");  //-u admin:password
    DefaultHttpClient httpClient = new DefaultHttpClient();
    httpClient.getCredentialsProvider().setCredentials(AuthScope.ANY, credentials);
    HttpPut put = new HttpPut("http://localhost:8080/my-server/file.ext");  //-X PUT
    put.setEntity(new FileEntity(new File("/absolute/path/file/to/upload/file.ext"), "image/png"));  //@ - absolute path
    httpClient.execute(put);
} catch(Exception e) {
    //-f, fail silently
}
6
répondu Tomasz Nurkiewicz 2012-02-28 18:51:48

curl est un utilitaire unix en ligne de commande auquel vous avez juste besoin de passer des options. Utilisation java.net, ou apache httpclient vous demandera d'écrire le code qui utilise ces paquets pour parler à votre service de repos. Ce n'est pas difficile à faire, et vous pouvez certainement répondre aux exigences de votre service, mais ce n'est pas aussi facile que de simplement utiliser curl.

1
répondu Rick Mangi 2012-02-28 18:02:02

si vous faites un test manuel rapide 'n' dirty, apprendre le curl est la voie à suivre en raison de son ubiquité.

mais cela ne vaut pas la peine d'essayer de l'intégrer dans Java (appeler D'autres processus de Java est semé d'embûches; voir ici http://kylecartmell.com/?p=9 ) donc si votre connexion fait partie d'un test d'intégration ou quelque chose comme ça, utiliser Java est beaucoup plus propre et plus portable. Il est également plus facile de contester ce qui se passe quand les choses échouent.

l'homme curl est votre ami pour trouver ces options, mais pour vous aider à démarrer:

HttpURLConnection bla = (HttpURLConnection) new URL("http://localhost:8080/my-server/").openConnection();
bla.setRequestMethod("PUT");
bla.connect();  
// Now read the inputstream / write the outputstream 
// per the linked answer in the original question 
0
répondu artbristol 2012-02-28 18:28:44