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;
}
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.
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
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
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.
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
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
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.
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"
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
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!
vous pouvez utiliser Postman avec son interface graphique intuitive pour assembler votre commande cURL
.
- Installer et Démarrer Postman
- tapez dans votre URL, POST Body, en-têtes de demande, etc. pp.
- cliquez sur
Code
- sélectionner
cURL
dans la liste déroulante - 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.
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 .
cela a fonctionné pour moi:
curl -H "Content-Type: application/json" -X POST -d @./my_json_body.txt http://192.168.1.1/json
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 -
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
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"}'
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
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
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
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.