Jak opublikować dane JSON za pomocą Curl z terminala/linii poleceń, aby przetestować odpoczynek wiosenny?

Używam Ubuntu i zainstalowałem na nim Curl. Chcę przetestować moją aplikację Spring REST z Curl. Kod Pocztowy napisałem na stronie Java. Jednak chcę go przetestować za pomocą Curl. Próbuję opublikować dane JSON. Przykładowe dane są takie:

{"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 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ż jednostka żądania jest w formacie, który nie jest obsługiwany przez żądany zasób dla żądanej metody ().

Tomcat log: "POST / UI / webapp/conf/clear HTTP / 1.1" 415 1051

Jakieś pomysły na odpowiedni format polecenia Curl?

EDIT:

To jest mój kod PUT strony Javy (przetestowałem GET i DELETE i 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;
} 
Author: Navid Vafaei, 2011-08-24

20 answers

Musisz ustawić content-type NA application / json. Ale -d wysyła Typ Content-Type application/x-www-form-urlencoded, który nie jest akceptowany po stronie Springa.

Patrząc na stronę podręcznika curl , myślę, że możesz użyć -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 od --header, -d dla --data)

Zauważ, że -request POST jest opcjonalne jeśli używasz -d, ponieważ znacznik -d implikuje żądanie POST.


Na Windows, rzeczy są nieco inne. Zobacz wątek komentarza.

 3378
Author: Sean Patrick Floyd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-03 21:43:03

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

curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf
 443
Author: Typisch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-24 10:04:24

Resty może Ci się przydać: https://github.com/micha/resty

Jest to owijarka okrągła, która upraszcza żądania odpoczynku z wiersza poleceń. Kierujesz go do punktu końcowego API, który udostępnia polecenia PUT I POST. (Przykłady zaadaptowane 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 typu treści. Można to jednak zrobić raz, aby ustawić domyślne dodawanie plików konfiguracyjnych według metody dla witryny: Ustawianie domyślnych opcji RESTY

 89
Author: mo-seph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-08 14:34:39

U mnie zadziałało:

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

To było szczęśliwie odwzorowane do kontrolera sprężyny:

@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 prostym POJO z właściwością id.

 70
Author: Luis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-27 21:47:50

Dla Windows, posiadanie pojedynczego cudzysłowu dla wartości -d nie działało dla mnie, ale działało po zmianie na podwójny cudzysłów. Musiałem też uciec od podwójnych cudzysłowów w nawiasach klamrowych.

Oznacza to, że nie działa:

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

Ale działa:

curl -i -X POST -H "Content-Type: application/json" -d "{\"key\":\"val\"}" http://localhost:8080/appname/path
 59
Author: venkatnz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-27 21:51:04

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

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

Następnie uruchom polecenie:

curl -v -H "Content-Type: application/json" -X POST --data @params.json -u your_username:your_password http://localhost:8000/env/add_server
 39
Author: Eduardo Cerqueira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-22 16:05:09

Dobrze mi to wyszło.

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

Gdzie,

-X oznacza czasownik http.

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

 33
Author: felipealves.gnu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-01 14:31:40

Mam ten sam problem. Mogę to rozwiązać podając

-H "Content-Type: application/json; charset=UTF-8"
 28
Author: Steffen Roller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-15 15:45:09

Używając okna CURL, spróbuj tego:

curl -X POST -H "Content-Type:application/json" -d "{\"firstName\": \"blablabla\",\"lastName\": \"dummy\",\"id\": \"123456\"}" http-host/_ah/api/employeeendpoint/v1/employee
 24
Author: Márcio Brener,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-12 11:37:54

Jeśli testujesz wiele JSON send / responses przeciwko interfejsowi RESTful, możesz sprawdzić wtyczkę Postman dla Chrome (która pozwala ręcznie zdefiniować testy usług internetowych) i jej węzeł.oparty na js Newman command-line companion (który pozwala na automatyzację testów względem "zbiorów" testów Postmana.) Zarówno darmowe, jak i otwarte!

 16
Author: ftexperts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-14 21:40:23

Możesz użyć Postman z intuicyjnym interfejsem graficznym do złożenia cURL polecenia.

  1. Install and Start Postman
  2. wpisz adres URL, treść wiadomości, nagłówki żądań itp. pp.
  3. Kliknij na Code
  4. Wybierz cURL z listy rozwijanej
  5. skopiuj i wklej swoje cURL polecenie

Uwaga: Istnieje kilka opcji automatycznego generowania żądań na rozwijanej liście, dlatego pomyślałem, że mój post był konieczny w pierwsze miejsce.

 15
Author: kiltek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-25 12:47:20

To działało dobrze dla mnie, Dodatkowo przy użyciu podstawowego uwierzytelniania:

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

Oczywiście nigdy nie należy używać uwierzytelniania podstawowego bez SSL i sprawdzonego certyfikatu.

Natknąłem się dziś na to ponownie, używając cURL 7.49.1 Cygwina Dla Windows... A gdy użyjemy --data lub --data-binary z argumentem JSON, cURL pomylił się i zinterpretował {} w JSON jako szablon URL. Dodanie argumentu -g, aby wyłączyć globowanie loków, naprawiło to.

Zobacz przechodząc URL z nawiasami do zwijania.

 13
Author: davenpcj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-27 21:49:25

To mi pomogło:

curl -H "Content-Type: application/json" -X POST -d @./my_json_body.txt http://192.168.1.1/json
 12
Author: Amit Vujic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-16 16:39:51

Trochę za późno na imprezę, ale nie widzę tego zamieszczonego, więc proszę bardzo, możesz też umieścić swój json w pliku i przekazać go do curl używając opcji -- file-upload poprzez standardowe wejście, tak:

 echo 'my.awesome.json.function({"do" : "whatever"})' | curl -X POST "http://url" -T -
 11
Author: iloveretards,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-13 19:41:11

HTTPie jest zalecaną alternatywą dla curl, ponieważ możesz zrobić tylko

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

Domyślnie mówi JSON i zajmie się zarówno ustawieniem niezbędnego nagłówka, jak i kodowaniem danych jako poprawnego JSON. Jest też:

Some-Header:value

Dla nagłówków i

name==value

Dla parametrów łańcucha zapytania. Jeśli masz dużą część danych, możesz je również odczytać z pliku, który ma być zakodowany w JSON:

 [email protected]
 10
Author: tosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-23 14:13:44

Używam poniższego formatu do testowania z serwerem WWW.

use -F 'json data'

Załóżmy, że format JSON dict:

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

Pełny przykład

curl -XPOST your_address/api -F comment='{"who":"some_one", "desc":"get it"}'
 7
Author: user3180641,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-27 21:50:02

Dla danych json

curl -H "Content-Type: application/json" -X POST -d '{"params1":"value1","param2":"value2"}' http://localhost:8080/api

Jeśli chcesz zamieścić jakiś plik

curl -X POST -F "data=@/Users/vishvajitpathak/Desktop/screen_1.png" http://localhost:8080/upload --insecure

W przypadku, gdy nie chcesz namieszać z https i http:

Lub po prostu

curl -X POST -F "data=@/Users/vishvajitpathak/Desktop/screen_1.png" http://localhost:8080/upload

 6
Author: Vishvajit Pathak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-11 06:52:48

Używam JSON w mojej aplikacji i jego proste jak:

curl -X POST -H "Content-Type:application/json" -d '{"params1":"value1","params2":"value2"} hostname:port/api

Ale jeśli masz dużą liczbę paramów, zawsze preferuj użycie pliku z ciałem żądania JSON, jak poniżej:

curl -X POST -H "Content-Type:application/json" -F "data=@/users/suchi/dekstop/JSON_request.txt" hostname:port/api
 4
Author: Suchi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-08 03:15:55

Utwórz plik JSON " MyData.json " i Dodaj treść:

[
    {
        "Key_one": "Value_one",
        "Key_two": "Value_two",
        "Key_three": "Value_three"
    }
]

Następnie należy uruchomić następujące polecenie:

curl -v -H "Content-Type: application/json" -X POST --data @MyData.json -u USERNAME:PASSWORD http://localhost:8000/env/add_server
 0
Author: Shrish Shrivastava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-08 12:25:04

Możesz przekazać rozszerzenie formatu, który chcesz jako koniec adresu url. jak http://localhost:8080/xx/xxx/xxxx.json

Lub

Http://localhost:8080/xx/xxx/xxxx.xml

Uwaga: musisz dodać zależności jackson i jaxb maven w swoim pom.

 -1
Author: Saurabh Oza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-16 09:57:33