Come posso inviare dati JSON con Curl da un terminale/commandline a Test Spring REST?

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 testarlo con cURL. Sto cercando di inviare un dato JSON. I dati di esempio sono come questo:

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

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à della richiesta è in un formato non supportato dalla risorsa richiesta per il metodo richiesto ().

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

Qual è il giusto formato del comando cURL?

Questo è il mio codice PUT lato Java (ho provato 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;
}
Soluzione

Devi impostare il tuo content-type su application/json. Ma -d invia il Content-Type application/x-www-form-urlencoded, che non è accettato da Spring.

Guardando la curl man page, 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, -d di --data)

Si noti che -request POST è opzionale se si usa -d, poiché il flag -d implica una richiesta POST.


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

Commentari (26)

Prova a mettere i tuoi dati in un file, diciamo body.json e poi usa

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

Ho appena incontrato lo stesso problema. Potrei risolverlo specificando

-H "Content-Type: application/json; charset=UTF-8"
Commentari (0)