Ako odoslať údaje JSON pomocou Curl z terminálu/príkazového riadku do aplikácie Test Spring REST?

Používam Ubuntu a nainštaloval som na ňom cURL. Chcem otestovať svoju aplikáciu Spring REST pomocou cURL. Svoj POST kód som napísal na strane Javy. Chcem ho však otestovať pomocou cURL. Snažím sa odoslať údaje JSON. Príklad údajov je takýto:

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

Používam tento príkaz:

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

Vráti to túto chybu:

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

Popis chyby je nasledovný:

Server odmietol túto požiadavku, pretože entita požiadavky je vo formáte, ktorý požadovaný zdroj nepodporuje pre požadovanú metódu ().

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

Aký je správny formát príkazu cURL?

Toto je môj kód PUT na strane Java (testoval som GET a DELETE a fungujú):

@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;
}
Riešenie

Musíte nastaviť typ obsahu na application/json. Ale -d posiela Content-Type application/x-www-form-urlencoded, ktorý nie je na strane Spring's akceptovaný.

Pri pohľade na curl man page si myslím, že môžete použiť -H:

-H "Content-Type: application/json"

Úplný príklad:

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

(-H je skratka pre --header, -d pre --data)

Všimnite si, že -request POST je nepovinné, ak použijete -d, pretože príznak -d znamená požiadavku POST.


V systéme Windows je situácia trochu odlišná. Pozrite si vlákno s komentármi.

Komentáre (26)

Skúste umiestniť svoje údaje do súboru, napríklad body.json, a potom použite

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

Práve som narazil na rovnaký problém. Mohol by som to vyriešiť zadaním

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