web-dev-qa-db-fra.com

Comment puis-je POST JSON avec Curl depuis un terminal / une ligne de commande pour tester Spring REST?

J'utilise Ubuntu et installé cURL dessus. Je souhaite 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 publier des données JSON. 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 retourne 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 Tomcat: "POST/ui/webapp/conf/clear HTTP/1.1" 415 1051

Quel est le bon format de la commande cURL?

Voici mon code 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;
}
2520
kamaci

Vous devez définir votre type de contenu sur application/json. Mais -d envoie le type de contenu _application/x-www-form-urlencoded_, qui n'est pas accepté du côté de Spring.

En regardant le page de manuel curl , 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 facultatif si vous utilisez _-d_, car le drapeau _-d_ implique un POST demande.


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

3934
Sean Patrick Floyd

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

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

Resty pourrait vous être utile: https://github.com/micha/resty

C'est un wrapper autour de CURL qui simplifie les requêtes en ligne de commande REST. Vous le dirigez vers le point de terminaison de votre API et vous obtenez 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

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

93
mo-seph

Pour Windows, le fait d'avoir un seul guillemet pour la valeur -d ne fonctionnait pas pour moi, mais cela fonctionnait après le passage au guillemet double. J'avais aussi besoin d'échapper aux guillemets doubles entre accolades.

C'est-à-dire que cela 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
81
venkatnz

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

79
Luis

Par exemple, créez un fichier JSON, params.json, et ajoutez-y ce contenu:

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

Ensuite, 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
50
Eduardo Cerqueira

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.

35
felipealves.gnu

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"
32
Steffen Roller

En utilisant CURL Windows, essayez ceci:

curl -X POST -H "Content-Type:application/json" -d "{\"firstName\": \"blablabla\",\"lastName\": \"dummy\",\"id\": \"123456\"}" http-Host/_ah/api/employeeendpoint/v1/employee
27
Márcio Brener

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

  1. Installer et démarrer Postman
  2. Tapez votre URL, corps du message, en-têtes de demande, etc. pp.
  3. Cliquez sur Code
  4. Sélectionnez cURL dans la liste déroulante
  5. copier et coller votre commande cURL

Remarque: La liste déroulante propose plusieurs options pour la génération automatique de requêtes. C'est pourquoi je pensais que mon message était nécessaire au départ.

24
kiltek

Si vous testez de nombreux envois/réponses JSON sur une interface RESTful, vous pouvez consulter le plug-in Postman pour Chrome (qui vous permet de définir manuellement tests de service Web) et son compagnon en ligne de commande Newman (qui vous permet d’automatiser les tests par rapport aux "collections" de tests Postman.) Gratuit et ouvert!

18
ftexperts

HTTPie est une alternative recommandée à curl car vous pouvez le faire simplement

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

Il parle JSON par défaut et se chargera de la définition de l'en-tête nécessaire ainsi que du codage des données au format JSON valide. Il y a aussi:

Some-Header:value

pour les en-têtes, et

name==value

pour les paramètres de chaîne de requête. Si vous avez une grande quantité de données, vous pouvez également le lire à partir d'un fichier au format JSON encodé:

 [email protected]
17
tosh

Vous pouvez également placer votre contenu JSON dans un fichier et le transmettre à curl à l'aide de l'option --file-upload via une entrée standard, comme ceci:

 echo 'my.awesome.json.function({"do" : "whatever"})' | curl -X POST "http://url" -T -
14
iloveretards

Cela a bien fonctionné pour moi, en utilisant également l’authentification BASIC:

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 devriez jamais utiliser l'authentification BASIC sans SSL et un certificat vérifié.

Je me suis heurté de nouveau à cela aujourd'hui, en utilisant le cURL 7.49.1 de Cygwin pour Windows ... et en utilisant --data ou --data-binary avec un argument JSON, cURL s'est embrouillé et interprétait le {} dans le JSON en tant que modèle d'URL. L'ajout d'un argument -g pour désactiver la suppression de cURL a résolu ce problème.

Voir aussi Passer une URL avec des crochets à curl.

14
davenpcj

Cela a fonctionné pour moi:

curl -H "Content-Type: application/json" -X POST -d @./my_json_body.txt http://192.168.1.1/json
13
Amit Vujic

J'utilise le format ci-dessous pour tester avec un serveur Web.

use -F 'json data'

Supposons ce format de dict JSON:

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

Exemple complet

curl -XPOST your_address/api -F comment='{"who":"some_one", "desc":"get it"}'
7
user3180641

Vous pouvez utiliser postman pour convertir en CURL enter image description here

enter image description here

3
forever LA
This worked for me for windows10
curl -d "{"""owner""":"""sasdasdasdasd"""}" -H "Content-Type: application/json" -X  PUT http://localhost:8080/api/changeowner/CAR4
1

Utilisez l'option -d pour ajouter une charge utile

curl -X POST \
http://<Host>:<port>/<path> \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"foo": "bar",
"lorem": "ipsum"
}'

En outre:

utilisez -X POST pour utiliser la méthode POST

utilisez -H 'Accept: application/json' pour ajouter l'en-tête de type accept

utilisez -H 'Content-Type: application/json' pour ajouter un en-tête de type de contenu

1
Sma Ma

Voici une autre façon de le faire, si vous avez des données dynamiques à inclure.

#!/bin/bash

version=$1
text=$2
branch=$(git rev-parse --abbrev-ref HEAD)
repo_full_name=$(git config --get remote.Origin.url | sed 's/.*:\/\/github.com\///;s/.git$//')
token=$(git config --global github.token)

generate_post_data()
{
  cat <<EOF
{
  "tag_name": "$version",
  "target_commitish": "$branch",
  "name": "$version",
  "body": "$text",
  "draft": false,
  "prerelease": false
}
EOF
}

echo "Create release $version for repo: $repo_full_name branch: $branch"
curl --data "$(generate_post_data)" "https://api.github.com/repos/$repo_full_name/releases?access_token=$token"
0
Anand Rockzz