Domanda Come caricare i dati JSON con Curl da Terminal / Commandline per testare il REST di Spring?


Io 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 pubblicare un dato JSON. Un esempio di dati è simile a 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}

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 ().

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

Qualche idea sul formato corretto del comando Curl?

MODIFICARE:

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

2041
2017-08-24 08:51


origine


risposte:


È necessario impostare il tipo di contenuto su application / json. Ma -d invia il tipo di contenuto application/x-www-form-urlencoded, che non è accettato da parte di Primavera.

Guardando il pagina man di arricciatura, 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 per --data)

Nota che -request POST è opzionale se usi -d, come il -d flag implica una richiesta POST.


Su Windows, le cose sono leggermente diverse. Vedi il thread del commento.


3227
2017-08-24 09:12



Prova a mettere i tuoi dati in un file, ad esempio body.json e quindi usare

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

424
2017-08-24 10:04



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

È un wrapper round CURL 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, però, per impostare un valore predefinito, per aggiungere i file di configurazione per-metodo per sito: Impostazione delle opzioni RESTY predefinite


86
2018-01-12 19:10



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 al 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.


69
2018-04-19 16:00



Per Windows, con una sola citazione per il -d il valore non ha funzionato per me, ma ha funzionato dopo aver cambiato il doppio preventivo. Inoltre avevo bisogno di sfuggire alle 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

58
2018-06-30 22:12



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

37
2018-01-05 23:10



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 vuoi inviare.


31
2017-07-01 14:31



Ho appena incontrato lo stesso problema. Potrei risolverlo specificando

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

26
2017-11-15 15:45



Usando 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

23
2017-12-20 23:45