Come posso pubblicare i dati JSON con cURL?


2834

Uso Ubuntu e ho installato cURL su di esso. Voglio testare la mia applicazione Spring REST con cURL. Ho scritto il mio codice POST sul lato Java. Tuttavia, voglio provarlo con cURL. Sto cercando di pubblicare dati JSON. I dati di esempio sono così:

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

Io uso questo comando:

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

Restituisce questo errore:

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 descrizione dell'errore è questa:

Il server ha rifiutato questa richiesta perché l'entità richiesta è in un formato non supportato dalla risorsa richiesta per il metodo richiesto ().

Registro Tomcat: "POST / ui / webapp / conf / clear HTTP / 1.1" 415 1051

Qual è il formato corretto del comando cURL?

Questo è il mio PUTcodice laterale Java (ho testato GET e DELETE e funzionano):

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

6
controlla il link per le richieste di post della primavera 3.2.0.
AmirHd,

8
C'è un bel post sull'utilizzo di Curl per i test ad hoc dei microservizi RESTful che copre questo con più esempi.
upitau,

Risposte:


4342

Devi impostare il tipo di contenuto su application / json. Ma -dinvia il Content-Type application/x-www-form-urlencoded, che non è accettato dal lato Spring.

Guardando la pagina man curl , penso che tu possa usare -H:

-H "Content-Type: application/json"

Esempio completo:

curl --header "Content-Type: application/json" \
  --request POST \
  --data '{"username":"xyz","password":"xyz"}' \
  http://localhost:3000/api/login

( -Hè l'abbreviazione di --header, -dper --data)

Si noti che -request POSTè facoltativo se si utilizza -d, poiché il -dflag implica una richiesta POST.


Su Windows, le cose sono leggermente diverse. Vedi il thread dei commenti.


262
Per Windows, le virgolette singole intorno a Json non funzionavano e ho finito per sfuggire alle doppie virgolette. curl -X POST -H "Content-Type: application/json" -d "{ \"key1\": \"value1\" }" http://localhost:3000/api/method
hIpPy

37
Per me sotto Windows avevo bisogno di sfuggire alle virgolette usando le virgolette in questo formato "{ """key1""": """value1""" }". Anche questa risposta: stackoverflow.com/questions/18314796/...
chodorowicz

4
@chodorowicz è terribile! Conosco solo quella sintassi di VB!
Sean Patrick Floyd,

3
Ho avuto problemi con le richieste POST ma l'ho risolto con "Application / json" maiuscolo, quindi se ricevi un errore 415, controlla le maiuscole.
WiteCastle,

5
@ostrokach mi dispiace che abbia perso tempo. la sintassi ha funzionato bene per me su OSX quando l'ho pubblicata (non ho provato ancora). Immagino che sia / fosse solo una differenza di piattaforma. Immagino che i voti siano delle persone che mi hanno aiutato.
Adam Tuttle,

565

Prova a mettere i tuoi dati in un file, ad esempio, body.jsonquindi usa

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

12
Probabilmente dovresti usare l' --data-binaryopzione invece di --data. Ci si aspetterebbe che il client invii i dati così come sono, ma --datarimuove CR e LF dall'input.
h2stein,

14
L'uso di cUrl con json inline Strings sembra essere un incubo. C'è la necessità di scapeggiare il personaggio con la doppia citazione. Andare con un file come questo è più bello.
Xtreme Biker,

46
È importante aggiungere un @carattere prima del nome del file, altrimenti non funzionerà. Ho appena passato 20 minuti a sbattere la testa per questa merda ...
Radu Murzea,

3
In questo modo puoi anche eseguire un lint JSON sul file per vedere se c'è un errore nell'analisi di JSON.
datashaman

4
Su Windows, hai bisogno di virgolette doppie attorno al nome del file "@ body.json"
Stomf

100

Potresti trovare utile resty: https://github.com/micha/resty

È un CURL circolare avvolgente che semplifica le richieste REST della riga di comando. Lo punti al tuo endpoint API e ti dà i comandi PUT e POST. (Esempi adattati dalla homepage)

$ 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

Inoltre, spesso è ancora necessario aggiungere le intestazioni del tipo di contenuto. Puoi farlo una volta, tuttavia, per impostare un valore predefinito, per aggiungere file di configurazione per metodo per sito per sito: Impostazione delle opzioni RESTY predefinite


93

Per Windows, avere una sola virgoletta per il -dvalore non ha funzionato per me, ma ha funzionato dopo essere passato alla doppia virgoletta. Inoltre avevo bisogno di sfuggire alle doppie virgolette tra parentesi graffe.

Cioè, il seguente non ha funzionato:

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

Ma il seguente ha funzionato:

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

5
Cordiali saluti - sembra che ti stia perdendo una doppia citazione di chiusura intorno al corpo json
acanby

3
Per me su Windows, il "intorno ai dati non funziona, senza virgolette invece
rodedo

3
Se stai usando PowerShell, vedi questa risposta.
rsenna,

86

Ha funzionato per me usando:

curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":100}' http://localhost/api/postJsonReader.do

È stato felicemente mappato sul controller 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è un semplice POJO con una proprietà id.


56

Ad esempio, crea un file JSON, params.json e aggiungi questo contenuto ad esso:

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

Quindi esegui questo comando:

curl -v -H "Content-Type: application/json" -X POST --data @params.json -u your_username:your_password http://localhost:8000/env/add_server

42

Ho appena incontrato lo stesso problema. Potrei risolverlo specificando

-H "Content-Type: application/json; charset=UTF-8"

37

Questo ha funzionato bene per me.

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

Dove,

-X Indica il verbo http.

--data Indica i dati che si desidera inviare.


5
In -X POSTquesto esempio è ridondante
l'ingegnere del software il

31

Puoi usare Postman con la sua GUI intuitiva per assemblare il tuo cURLcomando.

  1. Installa e avvia Postman
  2. Digita il tuo URL, corpo della posta, intestazioni di richiesta ecc. Pp.
  3. Clicca su Code
  4. Selezionare cURLdall'elenco a discesa
  5. copia e incolla il tuo cURLcomando

Nota: ci sono diverse opzioni per la generazione automatica di richieste nell'elenco a discesa, motivo per cui ho pensato che il mio post fosse necessario in primo luogo.


6
Non avevo capito che quella funzione fosse inclusa in Postman. Grazie per segnalarlo!
ariestav

29

Utilizzando CURL Windows, prova questo:

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


24

HTTPie è un'alternativa consigliata a curlperché puoi fare solo

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

Parla JSON per impostazione predefinita e gestirà sia l'impostazione dell'intestazione necessaria per te sia la codifica dei dati come JSON valido. C'è anche:

Some-Header:value

per le intestazioni e

name==value

per i parametri della stringa di query. Se hai una grande mole di dati, puoi anche leggerli da un file con codifica JSON:

 field=@file.txt

20

Se stai testando molti invii / risposte JSON su un'interfaccia RESTful, potresti voler controllare il plug-in Postman per Chrome (che ti consente di definire manualmente i test del servizio Web) e il suo comando Newman basato su Node.js -line companion (che consente di automatizzare i test contro le "raccolte" di test Postman.) Sia gratuiti che aperti!


18

Questo ha funzionato bene per me, utilizzando inoltre l'autenticazione 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

Ovviamente, non dovresti mai usare l'autenticazione BASIC senza SSL e un certificato verificato.

Mi sono imbattuto di nuovo oggi, usando il cURL 7.49.1 di Cygwin per Windows ... E quando si utilizzava --datao --data-binarycon un argomento JSON, il cURL si confondeva e interpretava {}il JSON come un modello di URL. L'aggiunta di un -gargomento per disattivare il globbing di CURL ha risolto il problema.

Vedi anche Passare un URL con parentesi per arricciare .


17

Puoi anche inserire il tuo contenuto JSON in un file e passarlo ad arricciarlo usando l' --file-uploadopzione tramite input standard, in questo modo:

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

16

Questo ha funzionato per me:

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

10

Sto usando il formato seguente per testare con un web server.

use -F 'json data'

Supponiamo che questo formato di dict JSON:

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

Esempio completo

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

6

Utilizzare l'opzione -d per aggiungere payload

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

Inoltre:

usa -X POST per usare il metodo POST

usa -H 'Accept: application / json' per aggiungere l'intestazione del tipo accetta

usa -H 'Content-Type: application / json' per aggiungere l'intestazione del tipo di contenuto


Ho provato ad usarlo ma ho ricevuto {"errori": ["nessun dato fornito"]} errore.
Suresh,

6

Si prega di controllare questo strumento . Ti aiuta a creare facilmente frammenti di ricciolo.

curl -XGET -H "Accept: application/json" -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"

6

Questo ha funzionato per me su Windows10

curl -d "{"""owner""":"""sasdasdasdasd"""}" -H "Content-Type: application/json" -X  PUT http://localhost:8080/api/changeowner/CAR4

5

Ecco un altro modo per farlo, se hai dati dinamici da includere.

#!/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"

1
Mi hai salvato la vita!
Abhimanyu


1

Se si configura SWAGGER per l'applicazione di avvio a molla e si richiama qualsiasi API dall'applicazione, è possibile visualizzare anche quella richiesta CURL.

Penso che questo sia il modo semplice di generare le richieste attraverso il CURL.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.