Pytanie Jak POST dane JSON z Curl z Terminal / Commandline do testowania Spring REST?


Używam Ubuntu i zainstalowałem na nim Curl. Chcę przetestować moją aplikację Spring REST z Curl. Napisałem swój kod POST po stronie Java. Jednak chcę przetestować go za pomocą Curl. Próbuję opublikować dane JSON. Przykładowe dane są następujące:

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

Używam tego polecenia:

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

Zwraca ten błąd:

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

Opis błędu jest następujący:

Serwer odrzucił to żądanie, ponieważ encja żądania jest w formacie nieobsługiwanym przez żądany zasób dla żądanej metody ().

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

Wszelkie pomysły na temat właściwego formatu polecenia Curl?

EDYTOWAĆ:

To jest mój kod PUT strony Java (testowałem GET i DELETE i one działają)

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

2049
2017-08-24 08:51


pochodzenie


Sprawdź połączyć na wiosnę 3.2.0 postów. - AmirHd
Jest fajny post Używanie curl do testowania ad hoc usług RESTful Microservices który obejmuje to wieloma przykładami. - upitau


Odpowiedzi:


Musisz ustawić typ zawartości na application / json. Ale -d wysyła typ zawartości application/x-www-form-urlencoded, co nie jest akceptowane po stronie Wiosny.

Patrząc na zwinąć stronę man, Myślę, że możesz z niego skorzystać -H:

-H "Content-Type: application/json"

Pełny przykład:

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

(-H jest skrótem --header, -d dla --data)

Zauważ, że -request POST jest opcjonalny Jeśli użyjesz -d, jako -d flaga oznacza żądanie POST.


W systemie Windows rzeczy są nieco inne. Zobacz wątek komentarza.


3234
2017-08-24 09:12



Usunąłem opcję -d z polecenia, ale wciąż tak samo. - kamaci
pełna składnia, dla każdego, kto może nadal być zdezorientowany, to: curl -X POST -H "Content-Type: application/json" -d '{"key":"val"}' URL - Adam Tuttle
curl -X POST -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:3000/api/login  pracował dla mnie. - shweta
W przypadku okien pojedyncze cytaty wokół jsona nie działały i skończyło mi się wydawanie podwójnych cytatów. curl -X POST -H "Content-Type: application/json" -d "{ \"key1\": \"value1\" }" http://localhost:3000/api/method - hIpPy
Dla mnie w Windowsie musiałem uciec z cytatów używając cytatów w tym formacie "{ """key1""": """value1""" }". Również ta odpowiedź: stackoverflow.com/questions/18314796/... - chodorowicz


Spróbuj umieścić swoje dane w pliku, powiedz body.json a następnie użyć

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

426
2017-08-24 10:04



Zwraca błąd 404 - kamaci
Prawdopodobnie powinieneś użyć --data-binary opcja zamiast --data. Można oczekiwać, że klient przesyła dane tak jak jest, ale --data paskuje CR i LF z wejścia. - h2stein
Używanie cUrl z inline json Struny wydaje się koszmarem. Konieczne jest zeskrobanie znaku podwójnego cudzysłowu. Przechodzenie z takim plikiem jest przyjemniejsze. - Xtreme Biker
Ważne jest, aby dodać @ znak przed nazwą pliku, w przeciwnym razie nie zadziała. Właśnie spędziłem 20 minut, waląc głową w te bzdury ... - Radu Murzea
W ten sposób można również uruchomić plik JSON w pliku, aby sprawdzić, czy wystąpił błąd podczas analizowania JSON. - datashaman


Może się okazać przydatny: https://github.com/micha/resty

Jest to okrągły CURL, który upraszcza żądania REST linii poleceń. Kierujesz go do punktu końcowego interfejsu API, który daje polecenia PUT i POST. (Przykłady dostosowane ze strony głównej)

$ 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

Ponadto często konieczne jest dodanie nagłówków Content Type. Możesz jednak zrobić to raz, aby ustawić domyślną opcję dodawania plików konfiguracyjnych dla każdej metody na stronę: Ustawianie domyślnych opcji RESTY


86
2018-01-12 19:10





To zadziałało dla mnie przy użyciu:

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

Szczęśliwie zostało to zmapowane do kontrolera 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 jest prosty POJO z właściwością id.


69
2018-04-19 16:00





W systemie Windows, mając pojedynczy cytat dla -d wartość nie działała dla mnie, ale zadziałała po zmianie na podwójny cytat. Potrzebowałem też uciec od podwójnych cudzysłowów w nawiasach klamrowych.

Oznacza to, że następujące czynności nie działają:

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

Ale działało następujące:

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

58
2018-06-30 22:12



FYI - wygląda na to, że brakuje ci zamkniętego podwójnego cudzysłowu wokół ciała JSON - acanby
Dla mnie w systemie Windows "wokół danych nie działa, zamiast tego nie działa cytaty - rodedo
Jeśli używasz PowerShell, zobacz to odpowiedź. - rsenna


Jako przykład utwórz plik JSON, params.json i dodaj do niego tę zawartość:

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

Następnie uruchom to polecenie:

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





To zadziałało dobrze dla mnie.

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

Gdzie,

-X Oznacza czasownik http.

--data Oznacza dane, które chcesz wysłać.


32
2017-07-01 14:31



The -X POST jest nadmiarowy w tym przykładzie - Engineer Dollery