web-dev-qa-db-fra.com

cURL POST sur le service WINDOWS RESTful

Mon problème: Utiliser l'outil de ligne de commande pour boucler mon serveur localhost lors de l'envoi de données avec ma demande POST est ne fonctionne pas.

Ce qui semble être à l'origine de l'erreur: Imaginez quelque chose comme ça

  1. curl -i -X POST -H 'Content-Type: application/json' -d '{"data1": "data goes here", "data2": "data2 goes here"}' http:localhost/path/to/api

Résultat des données retournées

curl: (6) Could not resolve Host: application; No data record of requested type
curl: (6) Could not resolve Host: data goes here,; No data record of requested type
curl: (6) Could not resolve Host: data2; No data record of requested type
curl: (3) [globbing] unmatched close brace/bracket at pos 16

Après quelques recherches, je me suis rendu compte que ce problème ne pourrait pas être le code sintax utilisé pour la requête car il fonctionne sur les shells UNIX.

Utilisez-vous éventuellement Windows? Cela ressemble donc à un shell complètement cassé qui ne traite pas correctement les guillemets simples ou doubles. Je viens d'essayer cette ligne de commande et cela a bien fonctionné sur ma machine Linux. http://curl.haxx.se/mail/archive-2011-03/0066.html

J'ai essayé de contourner ceux qui "s'en échappaient" mais cela ne fonctionnait toujours pas

2.

curl -i -X ​​POST -H 'Type de contenu: application/json' -d '{\ "data1 \":\"les données vont ici \",\"data2 \":\"data2 va ici \"} 'http: // localhost/path/to/api

3.

curl -i -X ​​POST -H 'Type de contenu: application/json' -d '{\ "data1 \":\"les données vont ici \",\"data2 \":\"data2 va ici \"} 'http: // localhost/path/to/api

Alors j'ai abandonné. Windows semble déconner avec l'objet JSON envoyé sur POST

55
Lothre1

J'ai rencontré le même problème sur mon ordinateur portable win7 x64 et j'ai réussi à le faire fonctionner avec la version curl qui est étiquetée Win64 - Generic w SSL en utilisant le format de ligne de commande très similaire:

C:\Projects\curl-7.23.1-win64-ssl-sspi>curl -H "Content-Type: application/json" -X POST http://localhost/someapi -d "{\"Name\":\"Test Value\"}"

Ce qui ne diffère de votre version 2e d'échappement qu'en utilisant des guillemets doubles autour de ceux échappés et la valeur du paramètre d'en-tête. Préférez certainement la syntaxe Linux plus.

107
user1683523

Une autre alternative plus facile pour la ligne de commande que la lutte contre les guillemets consiste à placer le fichier json dans un fichier et à utiliser le préfixe @ des paramètres curl, par exemple. avec ce qui suit dans json.txt:

{ "syncheader" : {
    "servertimesync" : "20131126121749",
    "deviceid" : "testDevice"
  }
}

alors dans mon cas je publie:

curl localhost:9000/sync -H "Content-type:application/json" -X POST -d @json.txt

Maintient le json plus lisible aussi.

44
wwkudu

Solution alternative: Une solution plus conviviale que la ligne de commande:

Si vous recherchez un moyen convivial d’envoyer et de demander des données à l’aide de méthodes HTTP autres que de simples méthodes GET, vous recherchez probablement une extension chrome comme celle-ci http: // goo.gl/rVW22f appelé AVANCED REST CLIENT

Pour les gars cherchant à rester en ligne de commande, je recommande cygwin:

J'ai fini par installer cygwin avec CURL, ce qui nous permet de Obtenez ce sentiment Linux - sous Windows !

En utilisant la ligne de commande Cygwin, ces problèmes ont été résolus et le plus important, la syntaxe de requête utilisée sur 1. fonctionnait correctement.

Liens utiles:

Où je téléchargeais le curl pour la ligne de commande Windows?

Pour plus d’informations sur l’installation et la gestion de curl avec cygwin, cliquez ici

J'espère que cela aidera quelqu'un parce que j'ai passé toute la matinée à ce sujet.

16
Lothre1

Au moins pour la version binaire de Windows que j'ai testée (( le binaire générique Win64 no-SSL , actuellement basée sur 7.33. )), vous êtes soumis à des limitations dans l'utilisation de la commande les arguments de ligne sont en cours d'analyse. La réponse par Noël décrit la syntaxe correcte dans ce paramètre, qui fonctionne également dans un fichier de commandes. En utilisant l'exemple fourni:

curl -i -X POST -H "Content-Type: application/json" -d "{""data1"":""data goes here"",""data2"":""data2 goes here""}" http:localhost/path/to/api

Une alternative plus propre pour éviter de traiter avec des caractères d'échappement, qui dépend de la bibliothèque utilisée pour analyser la ligne de commande, consiste à avoir votre texte au format JSON standard dans un fichier séparé:

curl -i -X POST -H "Content-Type: application/json" -d "@body.json" http:localhost/path/to/api
8
mysteryegg
  1. Essayez d’utiliser des guillemets doubles (") au lieu de guillemets simples (').
  2. Pour conserver les guillemets au format JSON, essayez de les doubler ("").
  3. Pour conserver les guillemets dans les données, essayez de les échapper deux fois de la manière suivante (\\ "").

    curl ... -d "{""data1"": ""data1 goes here"", ""data2"": ""data2 goes here""}"
    curl ... -d "{""data"": ""data \\""abc\\"" goes here""}"
    
4
xmas