Question Comment publier des données JSON avec Curl à partir de Terminal / Commandline pour tester Spring REST?


J'utilise Ubuntu et j'ai installé Curl dessus. 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 d'afficher une donnée JSON. 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 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 / effacer HTTP / 1.1" 415 1051

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

MODIFIER:

Ceci est mon code PUT côté Java (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;
} 

2042
2017-08-24 08:51


origine


Réponses:


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

En regardant le page de manuel curlJe pense que tu peux 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 court pour --header, -d pour --data)

Notez que -request POST est optionnel si tu utilises -d, comme -d L'indicateur implique une requête POST.


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


3229
2017-08-24 09:12



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

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

424
2017-08-24 10:04



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

C'est un wrapper autour de CURL qui simplifie les requêtes REST en ligne de commande. Vous le pointez sur votre point de terminaison 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 nécessaire d'ajouter les en-têtes Content Type. Vous pouvez le faire une fois, cependant, pour définir une valeur par défaut, ajouter des fichiers de configuration par méthode par site: Définition des options RESTY par défaut


86
2018-01-12 19:10



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 mappé sur 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é d'ID.


69
2018-04-19 16:00



Pour Windows, avoir un seul devis pour le -d la valeur n'a pas fonctionné pour moi, mais cela a fonctionné après avoir changé en double citation. Aussi, j'avais besoin d'échapper à des guillemets à l'intérieur des accolades.

Autrement dit, 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 les choses suivantes ont fonctionné:

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

58
2018-06-30 22:12



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

[
    {
        "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

37
2018-01-05 23:10



Cela a bien fonctionné pour moi.

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

Où,

-X Signifie le verbe http.

--data Désigne les données que vous souhaitez envoyer.


31
2017-07-01 14:31