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;
}
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.
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
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
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
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.
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
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"
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
Vous pouvez utiliser Postman avec son interface graphique intuitive pour assembler votre commande cURL
.
Code
cURL
dans la liste déroulantecURL
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.
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!
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]
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 -
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.
Cela a fonctionné pour moi:
curl -H "Content-Type: application/json" -X POST -d @./my_json_body.txt http://192.168.1.1/json
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'
}
}
curl -XPOST your_address/api -F comment='{"who":"some_one", "desc":"get it"}'
This worked for me for windows10
curl -d "{"""owner""":"""sasdasdasdasd"""}" -H "Content-Type: application/json" -X PUT http://localhost:8080/api/changeowner/CAR4
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
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"