Jak przesłać dane JSON za pomocą cURL?

2828

Używam Ubuntu i zainstalowałem na nim cURL . Chcę przetestować moją wiosenną aplikację REST za pomocą cURL. Napisałem mój kod POST po stronie Java. Chcę jednak przetestować to 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 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ż jednostka żądania ma format nieobsługiwany przez żądany zasób dla żądanej metody ().

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

Jaki jest prawidłowy format polecenia cURL?

To jest mój PUTkod boczny Java (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;
}
kamaci
źródło
6
sprawdź link do wiosennych żądań postów 3.2.0.
AmirHd
8
Jest ładny post Używanie curl do testowania ad hoc mikrousług RESTful, który opisuje to na wielu przykładach.
upitau

Odpowiedzi:

4338

Musisz ustawić typ zawartości na application / json. Ale -dwysyła 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

( -Hjest skrótem od --header, -ddla --data)

Pamiętaj, że -request POSTjest to opcjonalne, jeśli używasz -d, ponieważ -dflaga oznacza żądanie POST.


W systemie Windows sprawy wyglądają nieco inaczej. Zobacz temat komentarza.

Sean Patrick Floyd
źródło
262
W przypadku systemu Windows pojedyncze cudzysłowy wokół JSona nie działały, a ja ostatecznie unikałem podwójnych cudzysłowów. curl -X POST -H "Content-Type: application/json" -d "{ \"key1\": \"value1\" }" http://localhost:3000/api/method
hIpPy
37
Dla mnie w systemie Windows musiałem uciec od cytatów przy użyciu cytatów w tym formacie "{ """key1""": """value1""" }". Również ta odpowiedź: stackoverflow.com/questions/18314796/…
chodorowicz
4
@chodorowicz to okropne! Znam tylko tę składnię z VB!
Sean Patrick Floyd
3
Miałem problemy z żądaniami POST, ale rozwiązałem je wielkimi literami „Aplikacja / json”, więc jeśli pojawi się błąd 415, sprawdź wielkie litery.
WiteCastle
5
@ostrokach przepraszam, że zmarnowałem twój czas. składnia działała dla mnie dobrze w OSX, kiedy ją opublikowałem (nie próbowałem). Zgadnij, że to / była tylko różnica platformy. Wyobrażam sobie, że pozytywne opinie pochodzą od ludzi, którym pomógł.
Adam Tuttle,
564

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

curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf
Typisch
źródło
12
Prawdopodobnie powinieneś użyć tej --data-binaryopcji zamiast --data. Można się spodziewać, że klient wysyła dane takie, jakie są, ale --datausuwa CR i LF z danych wejściowych.
h2stein
14
Używanie cUrl z wbudowanymi ciągami json wydaje się być koszmarem. Istnieje potrzeba scape podwójnego cudzysłowu. Przejście do takiego pliku jest przyjemniejsze.
Xtreme Biker
46
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 to badziewie ...
Radu Murzea,
3
W ten sposób możesz również uruchomić w pliku Jinton, aby sprawdzić, czy wystąpił błąd podczas analizowania JSON.
datashaman
4
W systemie Windows potrzebne są podwójne cudzysłowy wokół nazwy pliku „@ body.json”
Stomf
101

Może być przydatny: https://github.com/micha/resty

Jest to okrągły CURL, który upraszcza żądania REST wiersza poleceń. Wskazujesz go na punkt końcowy interfejsu API, a on daje komendy 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 dodawanie nagłówków typu zawartości. Możesz to zrobić tylko raz, aby ustawić domyślną wartość dodawania plików konfiguracyjnych dla poszczególnych metod dla witryny: Ustawianie domyślnych opcji RESTY

mo-seph
źródło
93

W systemie Windows posiadanie pojedynczego cudzysłowu dla tej -dwartości nie działało dla mnie, ale działało po zmianie na podwójny cudzysłów. Musiałem także uniknąć podwójnych cudzysłowów w nawiasach klamrowych.

Oznacza to, że następujące działania nie działały:

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

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

curl -i -X POST -H "Content-Type: application/json" -d "{\"key\":\"val\"}" http://localhost:8080/appname/path
venkatnz
źródło
5
Do Twojej wiadomości - wygląda na to, że brakuje ci zamykającego podwójnego cytatu wokół ciała
Jsona
3
Dla mnie w systemie Windows „wokół danych nie działa, zamiast tego działa cytat
rodedo
3
Jeśli używasz programu PowerShell, zobacz odpowiedź.
rsenna
86

Działa 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

Na szczęście został zmapowany 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";
}

IdOnlyjest prostym POJO z właściwością id.

Luis
źródło
56

Na przykład utwórz plik JSON, params.json i dodaj do niego następującą treść:

[
    {
        "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
Eduardo Cerqueira
źródło
42

Właśnie napotkałem ten sam problem. Mógłbym to rozwiązać, określając

-H "Content-Type: application/json; charset=UTF-8"
Steffen Roller
źródło
37

To działało dla mnie dobrze.

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

Gdzie,

-X Oznacza czasownik http.

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

felipealvesgnu
źródło
5
Jest -X POSTto zbędne w tym przykładzie
Inżynier oprogramowania
31

Możesz użyć Postmana z intuicyjnym GUI, aby skompletować swoje cURLpolecenie.

  1. Zainstaluj i uruchom Listonosza
  2. Wpisz swój adres URL, treść postu, nagłówki żądania itp. Pp.
  3. Kliknij Code
  4. Wybierz cURL z rozwijanej listy
  5. skopiuj i wklej swoje cURLpolecenie

Uwaga: Istnieje kilka opcji automatycznego generowania żądań na liście rozwijanej, dlatego właśnie uważałem, że mój post jest konieczny.

kiltek
źródło
6
Nie zdawałem sobie sprawy, że ta funkcja została zawarta w Listonoszu. Dzięki za wskazanie tego!
ariestav
29

Korzystając z CURL Windows, 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
Márcio Brener
źródło
28

Możesz użyć listonosza, aby przekonwertować na CURLwprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

bajt mamba
źródło
1
Wielkie
24

HTTPie jest zalecaną alternatywą, curlponieważ możesz to zrobić

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

Domyślnie mówi JSON i obsłuży zarówno ustawienie niezbędnego nagłówka, jak i kodowanie danych jako prawidłowego JSON. Jest również:

Some-Header:value

dla nagłówków i

name==value

dla parametrów ciągu zapytania. Jeśli masz dużą część danych, możesz także odczytać je z pliku, jeśli ma być zakodowany w JSON:

 field=@file.txt
bzdury
źródło
20

Jeśli testujesz wiele wysyłanych / odpowiedzi JSON na interfejsie RESTful, możesz wypróbować wtyczkę Postman dla Chrome (która pozwala ręcznie definiować testy usług internetowych) i jej komendę Newman opartą na Node.js -line towarzysz (który pozwala zautomatyzować testy względem „kolekcji” testów Listonosza). Zarówno darmowy, jak i otwarty!

ftexperts
źródło
18

Działa to dla mnie dobrze, wykorzystując dodatkowo uwierzytelnianie BASIC:

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 BASIC bez SSL i sprawdzonego certyfikatu.

Znowu się z tym spotkałem, używając cURL 7.49.1 Cygwina dla Windows ... A kiedy używałem --datalub --data-binaryz argumentem JSON, cURL się pomylił i zinterpretowałby to {}w JSON jako szablon URL. -gNaprawiono to, dodając argument wyłączający globowanie cURL.

Zobacz także Przekazywanie adresu URL z nawiasami do zwijania się .

davenpcj
źródło
17

Możesz także umieścić swoją zawartość JSON w pliku i przekazać ją do zwijania za pomocą --file-uploadopcji za pomocą standardowego wejścia, jak poniżej:

 echo 'my.awesome.json.function({"do" : "whatever"})' | curl -X POST "http://url" -T -
niken
źródło
16

To działało dla mnie:

curl -H "Content-Type: application/json" -X POST -d @./my_json_body.txt http://192.168.1.1/json
Amit Vujic
źródło
10

Korzystam z poniższego formatu do testowania na serwerze WWW.

use -F 'json data'

Załóżmy ten format dict JSON:

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

Pełny przykład

curl -XPOST your_address/api -F comment='{"who":"some_one", "desc":"get it"}'
użytkownik3180641
źródło
6

Użyj opcji -d, aby dodać ładunek

curl -X POST \
http://<host>:<port>/<path> \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"foo": "bar",
"lorem": "ipsum"
}'

Dodatkowo:

użyj -X POST, aby użyć metody POST

użyj -H 'Accept: application / json', aby dodać nagłówek typu accept

użyj -H „Content-Type: application / json”, aby dodać nagłówek typu zawartości

Sma Ma
źródło
Próbowałem go użyć, ale wystąpił błąd {„error”: [„no data data”]}.
Suresh
6

To działało dla mnie na Windows10

curl -d "{"""owner""":"""sasdasdasdasd"""}" -H "Content-Type: application/json" -X  PUT http://localhost:8080/api/changeowner/CAR4
sudhanshu srivastava
źródło
5

Sprawdź to narzędzie . Pomaga w łatwym tworzeniu fragmentów curl.

curl -XGET -H "Accept: application/json" -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"
Pranay Kumar
źródło
5

Oto inny sposób na zrobienie tego, jeśli chcesz uwzględnić dane dynamiczne.

#!/bin/bash

version=$1
text=$2
branch=$(git rev-parse --abbrev-ref HEAD)
repo_full_name=$(git config --get remote.origin.url | sed 's/.*:\/\/github.com\///;s/.git$//')
token=$(git config --global github.token)

generate_post_data()
{
  cat <<EOF
{
  "tag_name": "$version",
  "target_commitish": "$branch",
  "name": "$version",
  "body": "$text",
  "draft": false,
  "prerelease": false
}
EOF
}

echo "Create release $version for repo: $repo_full_name branch: $branch"
curl --data "$(generate_post_data)" "https://api.github.com/repos/$repo_full_name/releases?access_token=$token"
Anand Rockzz
źródło
1
Uratowałeś mi życie!
Abhimanyu
4

Wiem, wiele odpowiedzi na to pytanie, ale chciałem się podzielić, gdzie miałem problem:

curl -X POST http: // your-server-end-point -H "Content-Type: application / json" -d @ path-of-your-json-file.json

Widzisz, zrobiłem wszystko dobrze, tylko jedna rzecz - „@” Przegapiłem przed ścieżką do pliku JSON.

Znalazłem jeden odpowiedni dokument w Internecie - https://gist.github.com/subfuzion/08c5d85437d5d4f00e58

Mam nadzieję, że to może pomóc nielicznym. dzięki

Jesteś niesamowity
źródło
1

Jeśli skonfigurujesz SWAGGER do aplikacji wiosennego rozruchu i wywołasz tam dowolny interfejs API ze swojej aplikacji, zobaczysz również Żądanie CURL.

Myślę, że jest to łatwy sposób generowania żądań za pomocą CURL.

AnilkumarReddy
źródło