web-dev-qa-db-fra.com

Envoi de fichiers json dans des requêtes curl avec des chemins absolus ou relatifs

Je me demande juste comment envoyer une commande curl avec l'option -d spécifiant un fichier avec son chemin et non un fichier dans le répertoire courant.

C'est ce que j'obtiens lorsque j'essaie de tester mon application avec le fichier json dans le répertoire local. L'application et moi-même sommes heureux:

curl -XPOST -H 'Content-Type:application/json' -d @all_fields.json http://testcomp.lab.net:8080/stats -v -s
* About to connect() to testcomp.lab.net port 8080
*   Trying 10.93.2.197... connected
* Connected to testcomp.lab.net (10.93.2.197) port 8080
> POST /stats HTTP/1.1
> User-Agent: curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
> Host: testcomp.lab.net:8080
> Accept: */*
> Content-Type:application/json
> Content-Length: 2882
> Expect: 100-continue
> 
< HTTP/1.1 100 Continue
HTTP/1.1 200 OK
< Content-Length: 0
* Connection #0 to Host testcomp.lab.net left intact
* Closing connection #0

C'est ce que j'obtiens quand je spécifie un fichier json qui se trouve dans un autre répertoire

curl -XPOST -H 'Content-Type:application/json' -d @json/all_fields.json http://testcomp.lab.net:8080/stats -v -s
"Invalid json for Java type interface Java.util.List"
Warning: Couldn't read data from file "json/all_fields.json", this makes an 
Warning: empty POST.

<snip snip>
<snip snip>

< HTTP/1.1 400 Bad Request
< Content-Type: application/json
< Transfer-Encoding: chunked
* Connection #0 to Host testcomp.lab.net left intact
* Closing connection #0

Je n'ai rien vu dans la page de manuel de curl pour spécifier les répertoires des fichiers transmis en tant que données. Suis-je malheureusement limité aux fichiers du répertoire local ou existe-t-il un moyen spécial de spécifier des fichiers dans différents répertoires? Merci d'avance pour votre aide.

27
Classified

L'option de commande -d @ Accepte tout chemin de fichier résoluble, tant que le chemin existe réellement. Vous pouvez donc utiliser:

  • un chemin par rapport au répertoire courant
  • un parcours complet
  • un chemin avec des soft-links dedans
  • etc

À savoir, tout comme des centaines d'autres commandes de style * Nix. Une note rapide, l'option -d Tentera de coder vos données par URL, qui d'après ce que vous décrivez n'est pas réellement ce que vous voulez. Vous devez plutôt utiliser l'option --data-binary. Quelque chose comme ça:

curl -XPOST
     -H 'Content-Type:application/json'
     -H 'Accept: application/json'
     --data-binary @/full/path/to/test.json
     http://localhost:8080/easy/eservices/echo -v -s
50
Perception