Comment afficher les données JSON avec Curl à partir du Terminal / ligne de commande pour tester Spring REST?

J'utilise Ubuntu et Curl installé sur elle. Je veux tester mon application Spring REST avec Curl. J'ai écrit mon code postal à Java side. Cependant, je veux le tester avec Curl. J'essaie de poster un JSON data. Un exemple de données est comme ceci:

{"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 requête parce que l'entité de requête est dans un format non supporté par la ressource demandée pour la méthode demandée ().

logs du serveur Tomcat: "POST / ui/webapp / conf / clear HTTP / 1.1 "415 1051

des idées sur le bon format de la commande Curl?

EDIT:

C'est mon côté Java PUT code (j'ai testé GET et SUPPRIMER et ils travaillent)

@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;
} 
2141
demandé sur Navid Vafaei 2011-08-24 12:51:11

20 réponses

vous devez définir votre type de contenu à application/json. Mais -d envoie le type de contenu application/x-www-form-urlencoded , qui n'est pas accepté sur le côté du ressort.

Regardant curl homme page , je pense que vous pouvez utiliser -H :

-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 l'abréviation de --header , -d pour --data )

notez que -request POST est optionnel si vous utilisez -d , comme le drapeau -d implique une requête POST.


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

3378
répondu Sean Patrick Floyd 2018-05-03 21:43:03

essayez de mettre vos données dans un fichier, dites body.json et puis utilisez

curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf
443
répondu Typisch 2011-08-24 10:04:24

vous pourriez trouver resty utile: https://github.com/micha/resty

C'est une boucle ronde enveloppante qui simplifie les demandes de repos en ligne de commande. Vous le pointez sur votre terminal API, et il vous donne les 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

en outre, il est souvent encore nécessaire d'ajouter les en-têtes de type de contenu. Vous pouvez le faire une fois, bien que, pour définir un défaut, d'ajouter des fichiers de configuration par méthode par site: Réglage par défaut RESTY options

89
répondu mo-seph 2013-02-08 14:34:39

cela a fonctionné 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é heureusement cartographié au contrôleur de ressort:

@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.

70
répondu Luis 2017-05-27 21:47:50

Pour Windows, avoir un seul devis pour la valeur -d n'a pas fonctionné pour moi, mais il a fonctionné après avoir changé à double devis. Aussi j'ai eu besoin d'échapper aux guillemets doubles à l'intérieur des crochets bouclés.

C'est-à-dire que les dispositions suivantes n'ont pas fonctionné:

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

mais ouvré comme suit:

curl -i -X POST -H "Content-Type: application/json" -d "{\"key\":\"val\"}" http://localhost:8080/appname/path
59
répondu venkatnz 2017-05-27 21:51:04

comme exemple, créez un fichier JSON, params.json, et ajouter ce contenu à elle:

[
    {
        "environment": "Devel",
        "description": "Machine for test, please do not delete!"
    }
]

alors vous exécutez cette commande:

curl -v -H "Content-Type: application/json" -X POST --data @params.json -u your_username:your_password http://localhost:8000/env/add_server
39
répondu Eduardo Cerqueira 2018-01-22 16:05:09

Cela a bien fonctionné pour moi.

curl -X POST --data @json_out.txt http://localhost:8080/

où,

-X signifie le verbe http.

--data signifie les données que vous souhaitez envoyer.

33
répondu felipealves.gnu 2015-07-01 14:31:40

je viens de rencontrer le même problème. Je pourrais le résoudre en spécifiant

-H "Content-Type: application/json; charset=UTF-8"
28
répondu Steffen Roller 2011-11-15 15:45:09

avec des fenêtres bouclées, essayez ceci:

curl -X POST -H "Content-Type:application/json" -d "{\"firstName\": \"blablabla\",\"lastName\": \"dummy\",\"id\": \"123456\"}" http-host/_ah/api/employeeendpoint/v1/employee
24
répondu Márcio Brener 2015-03-12 11:37:54

si vous testez beaucoup de JSON send/responses par rapport à une interface RESTful, vous pouvez consulter le plug-in Postman pour Chrome (qui vous permet de définir manuellement les tests de service web) et son noeud.js-based Newman command-line companion (qui vous permet d'automatiser les tests contre les "collections" de tests Postman.) À la fois libre et ouvert!

16
répondu ftexperts 2017-02-14 21:40:23

vous pouvez utiliser Postman avec son interface graphique intuitive pour assembler votre commande cURL .

  1. Installer et Démarrer Postman
  2. tapez dans votre URL, POST Body, en-têtes de demande, etc. pp.
  3. cliquez sur Code
  4. sélectionner cURL dans la liste déroulante
  5. copier & coller votre commande cURL

Note: Il y a plusieurs options pour la génération automatique de requêtes dans la liste déroulante, c'est pourquoi j'ai pensé que mon poste était nécessaire en premier lieu.

15
répondu kiltek 2017-09-25 12:47:20

cela a bien fonctionné pour moi, en utilisant en outre l'authentification de base:

curl -v --proxy '' --basic -u Administrator:password -X POST -H "Content-Type: application/json"
        --data-binary '{"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://httpbin.org/post

bien sûr, vous ne devez jamais utiliser l'authentification de base sans SSL et un certificat vérifié.

je suis tombé sur ce encore aujourd'hui, en utilisant la boucle de Cygwin 7.49.1 Pour Windows... Et quand on utilise --data ou --data-binary avec un argument JSON, cURL se confond et interprète le {} dans le JSON comme un modèle D'URL. Ajout d'un argument -g pour arrêter cURL globbing réparé cela.

Voir aussi passer une URL avec des crochets à curl .

13
répondu davenpcj 2017-05-27 21:49:25

cela a fonctionné pour moi:

curl -H "Content-Type: application/json" -X POST -d @./my_json_body.txt http://192.168.1.1/json
12
répondu Amit Vujic 2016-10-16 16:39:51

un peu en retard à la fête, mais je ne vois pas cela posté, donc voici, vous pouvez aussi mettre votre json dans un fichier et le passer à curl en utilisant l'option --file-upload via l'entrée standard, comme ceci:

 echo 'my.awesome.json.function({"do" : "whatever"})' | curl -X POST "http://url" -T -
11
répondu iloveretards 2017-06-13 19:41:11

HTTPie est préférable à curl parce que vous pouvez juste faire

$ http POST http://example.com/some/endpoint name=value name1=value1

il parle JSON par défaut et traitera à la fois le réglage de l'en-tête nécessaire pour vous ainsi que l'encodage des données comme JSON valide. Il y a aussi:

Some-Header:value

pour les en-têtes, et

name==value

pour les paramètres de la chaîne de requête. Si vous avez un grand bloc de données, vous pouvez également le lire à partir d'un fichier il a été encodé par JSON:

 field=@file.txt
10
répondu tosh 2018-08-23 14:13:44

j'utilise le format ci-dessous pour tester avec un serveur web.

use -F 'json data'

supposons ce format JSON dict:

{
    'comment': {
        'who':'some_one',
        'desc' : 'get it'
    }
}

exemple complet

curl -XPOST your_address/api -F comment='{"who":"some_one", "desc":"get it"}'
7
répondu user3180641 2017-05-27 21:50:02

pour JSON data

curl -H "Content-Type: application/json" -X POST -d '{"params1":"value1","param2":"value2"}' http://localhost:8080/api

si vous voulez poster un fichier

curl -X POST -F "data=@/Users/vishvajitpathak/Desktop/screen_1.png" http://localhost:8080/upload --insecure

dans le cas où vous ne voulez pas faire d'erreur avec https et http:

OU Simplement

curl -X POST -F "data=@/Users/vishvajitpathak/Desktop/screen_1.png" http://localhost:8080/upload

6
répondu Vishvajit Pathak 2017-10-11 06:52:48

j'utilise JSON dans mon application et son simple comme:

curl -X POST -H "Content-Type:application/json" -d '{"params1":"value1","params2":"value2"} hostname:port/api

mais si vous avez un grand nombre de paramètres, préférez toujours utiliser un fichier avec le corps de la requête JSON comme ci-dessous:

curl -X POST -H "Content-Type:application/json" -F "data=@/users/suchi/dekstop/JSON_request.txt" hostname:port/api
4
répondu Suchi 2018-05-08 03:15:55

Créer fichier JSON" MyData.json" et ajouter contenu:

[
    {
        "Key_one": "Value_one",
        "Key_two": "Value_two",
        "Key_three": "Value_three"
    }
]

Après cela, vous devez exécuter la commande suivante:

curl -v -H "Content-Type: application/json" -X POST --data @MyData.json -u USERNAME:PASSWORD http://localhost:8000/env/add_server
0
répondu Shrish Shrivastava 2018-10-08 12:25:04

vous pouvez passer l'extension du format que vous voulez comme la fin de l'url. comme http://localhost:8080/xx/xxx/xxxx .json

ou

http://localhost:8080/xx/xxx/xxxx .xml

Note: vous devez ajouter les dépendances jackson et jaxb maven dans votre pom.

-1
répondu Saurabh Oza 2018-07-16 09:57:33