3705 votes

Comment puis-je envoyer des données JSON avec cURL ?

J'utilise Ubuntu et j'ai installé cURL sur elle. Je veux tester mon application Spring REST avec cURL. J'ai écrit mon code POST du côté Java. Cependant, je veux le tester avec cURL. J'essaie de poster une donnée JSON. L'exemple de données est le suivant :

{"value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true}

J'utilise cette commande :

curl -i \
    -H "Accept: application/json" \
    -H "X-HTTP-Method-Override: PUT" \
    -X POST -d "value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true \
    http://localhost:8080/xx/xxx/xxxx

Il renvoie cette erreur :

HTTP/1.1 415 Unsupported Media Type
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 1051
Date: Wed, 24 Aug 2011 08:50:17 GMT

La description de l'erreur est la suivante :

Le serveur a refusé cette demande car l'entité de la demande est dans un format non pris en charge par la ressource demandée pour la méthode demandée ().

Journal de Tomcat : "POST /ui/webapp/conf/clear HTTP/1.1" 415 1051

Quel est le bon format de la commande cURL ?

Voici mon côté Java PUT (J'ai testé GET et DELETE et ils fonctionnent) :

@RequestMapping(method = RequestMethod.PUT)
public Configuration updateConfiguration(HttpServletResponse response, @RequestBody Configuration configuration) { //consider @Valid tag
    configuration.setName("PUT worked");
    //todo If error occurs response.sendError(HttpServletResponse.SC_NOT_FOUND);
    return configuration;
}

7 votes

Vérifier le lien pour les demandes de poste de Spring 3.2.0.

14 votes

Il y a un bon article Utilisation de Curl pour les tests ad hoc des microservices RESTful qui couvre ce sujet avec de multiples exemples.

1 votes

Aidez-moi sur ce point stackoverflow.com/questions/65359210/

5505voto

Sean Patrick Floyd Points 109428

Vous devez définir votre type de contenu à application/json. Mais -d (o --data ) envoie le Content-Type application/x-www-form-urlencoded ce qui n'est pas accepté du côté de Spring.

En regardant le page de manuel curl je pense que vous pouvez utiliser -H (o --header ) :

-H "Content-Type: application/json"

Exemple complet :

curl --header "Content-Type: application/json" \
  --request POST \
  --data '{"username":"xyz","password":"xyz"}' \
  http://localhost:3000/api/login

( -H est le diminutif de --header , -d pour --data )

Notez que -request POST es en option si vous utilisez -d comme le -d implique une demande POST.


Sous Windows, les choses sont légèrement différentes. Voir le fil de commentaires.

1 votes

@kamaci Je ne pense pas que vous ayez besoin de supprimer -d, utilisez simplement -H en plus.

1 votes

J'essaie cela : curl -i -H "Accept : application/json" -H "X-HTTP-Method-Override : PUT" -X POST -d "value" : "30", "type" : "Tip 3", "targetModule" : "Target 3", "configurationGroup":null, "name" : "Configuration Deneme 3", "description":null, "identity" : "Configuration Deneme 3", "version":0, "systemId":3, "active":true localhost:8080/ui/webapp/conf

1 votes

@kamaci OK alors j'ai peur de ne pas pouvoir vous aider sans avoir accès aux journaux de votre serveur. Je n'ai actuellement pas accès aux projets Spring MVC. J'essaierais de rechercher le chemin d'accès à la requête http dans votre fichier journal et je continuerais à partir de là. Peut-être pourriez-vous joindre un extrait pertinent du journal à cette question.

716voto

Typisch Points 831

Essayez de mettre vos données dans un fichier, par exemple body.json et ensuite utiliser

curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf

2 votes

Caisse la réponse sur la façon d'utiliser CURL et ce que signifient les différentes erreurs.

31 votes

Vous devriez probablement utiliser le --data-binary au lieu de l'option --data . On pourrait s'attendre à ce que le client envoie les données telles quelles, mais --data supprime CR et LF de l'entrée.

27 votes

L'utilisation de cUrl avec des chaînes json en ligne semble être un cauchemar. Il y a le besoin de faire disparaître le caractère double guillemet. Il est plus agréable d'utiliser un fichier comme celui-ci.

151voto

venkatnz Points 31

Pour Windows, le fait d'avoir une seule citation pour le -d n'a pas fonctionné pour moi, mais il a fonctionné après avoir été remplacé par des guillemets doubles. J'avais également besoin d'échapper aux guillemets doubles à l'intérieur des accolades.

C'est-à-dire que ce qui suit n'a pas fonctionné :

curl -i -X POST -H "Content-Type: application/json" -d '{"key":"val"}' http://localhost:8080/appname/path

Mais ce qui suit a fonctionné :

curl -i -X POST -H "Content-Type: application/json" -d "{\"key\":\"val\"}" http://localhost:8080/appname/path

6 votes

Pour info - il semble qu'il manque un guillemet fermant autour du corps json

4 votes

Pour moi, sous Windows, le " autour des données ne fonctionne pas, les guillemets ne fonctionnent pas.

4 votes

Si vous utilisez PowerShell, voir este réponse.

119voto

mo-seph Points 1403

Vous pourriez trouver Resty utile : https://github.com/micha/resty

Il s'agit d'un wrapper autour de CURL qui simplifie les requêtes REST en ligne de commande. Vous le faites pointer vers le point de terminaison de votre API et il vous donne des commandes PUT et POST. (Exemples adaptés de la page d'accueil)

$ resty http://127.0.0.1:8080/data #Sets up resty to point at your endpoing
$ GET /blogs.json                  #Gets http://127.0.0.1:8080/data/blogs.json
                                   #Put JSON
$ PUT /blogs/2.json '{"id" : 2, "title" : "updated post", "body" : "This is the new."}'
                                   # POST JSON from a file
$ POST /blogs/5.json < /tmp/blog.json

De plus, il est souvent nécessaire d'ajouter les en-têtes Content Type. Vous pouvez le faire une fois, pour définir une valeur par défaut, ou ajouter des fichiers de configuration par méthode et par site : Définition des options RESTY par défaut

108voto

Luis Points 191

Ça a marché pour moi en utilisant :

curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":100}' http://localhost/api/postJsonReader.do

Il a été joyeusement mis en correspondance avec le contrôleur Spring :

@RequestMapping(value = "/postJsonReader", method = RequestMethod.POST)
public @ResponseBody String processPostJsonData(@RequestBody IdOnly idOnly) throws Exception {
        logger.debug("JsonReaderController hit! Reading JSON data!"+idOnly.getId());
        return "JSON Received";
}

IdOnly est un simple POJO avec une propriété id.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X