pass - Comment publier des données JSON avec Curl de Terminal/Commandline à Test Spring REST?




php http curl post json (12)

J'utilise Ubuntu et j'ai installé Curl dessus. Je souhaite tester mon application Spring REST avec Curl. J'ai écrit mon code POST côté Java. Cependant, je veux le tester avec Curl. J'essaie de publier des données 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 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

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;
} 

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 entendu, vous ne devez 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 lorsque vous utilisiez --data ou --data-binary avec un argument JSON, cURL était confus et interprétait le {} dans le JSON comme une URL. modèle. L'ajout d'un argument -g pour désactiver la suppression de cURL a résolu ce problème.

Voir aussi Passage d'une URL avec des crochets à curl .


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.


Cela a fonctionné pour moi:

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

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

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"}'

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"

Pour Windows, le fait d'avoir un seul devis pour la valeur -d ne fonctionnait pas pour moi, mais cela fonctionnait après le passage au double guillemet. 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

Resty pourrait vous être 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 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 par défaut l'ajout de fichiers de configuration par méthode et par site: Définition des options RESTY par défaut


Un peu en retard pour la fête, mais je ne vois pas cela posté, alors allez-y, vous pouvez aussi mettre votre fichier json dans un fichier et le transmettre à 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 -

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

En regardant la 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 l'indicateur -d implique une demande POST.

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


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 le 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 j'ai pensé que mon message était nécessaire au départ.


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

$ 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]




curl