CURL ile JSON verilerini nasıl POST yapabilirim?


2831

Ubuntu kullanıyorum ve üzerine cURL yükledim . Spring REST uygulamamı cURL ile test etmek istiyorum. POST kodumu Java tarafına yazdım. Ancak, bunu cURL ile test etmek istiyorum. Bir JSON veri göndermeye çalışıyorum. Örnek veriler şöyledir:

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

Bu komutu kullanıyorum:

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

Bu hatayı döndürür:

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

Hata açıklaması şudur:

İstek varlığı, istenen yöntem () için istenen kaynak tarafından desteklenmeyen bir biçimde olduğundan sunucu bu isteği reddetti.

Tomcat günlüğü: "POST / ui / webapp / conf / clear HTTP / 1.1" 415 1051

CURL komutunun doğru biçimi nedir?

Bu benim Java yan PUTkodu (GET ve DELETE test ettik ve çalışıyorlar):

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

6
bahar 3.2.0 sonrası istekleri için bağlantıyı kontrol edin .
AmirHd

8
Bunu birden çok örnekle kapsayan RESTful Microservices Ad Hoc Testing için Curl kullanma güzel bir yazı var .
upitau

Yanıtlar:


4340

İçerik türünüzü application / json olarak ayarlamanız gerekir. Ancak , Bahar tarafında kabul edilmeyen -dİçerik Türü'nü gönderir application/x-www-form-urlencoded.

Kıvırmak adam sayfasına bakarak, kullanabileceğinizi düşünüyorum -H:

-H "Content-Type: application/json"

Tam örnek:

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

( -HKısaltması --header, -diçin --data)

Not -request POSTolan isteğe bağlı kullanırsanız -dolarak, -dbayrak bir POST isteği ima eder.


Windows'da işler biraz farklı. Yorum başlığına bakın.


262
Windows için, json etrafında tek tırnak işe yaramadı ve ben çift tırnak kaçan sona erdi. curl -X POST -H "Content-Type: application/json" -d "{ \"key1\": \"value1\" }" http://localhost:3000/api/method
hIpPy

37
Benim için Windows altında bu biçimde tırnak kullanarak tırnak kaçmak gerekiyordu "{ """key1""": """value1""" }". Ayrıca bu cevap: stackoverflow.com/questions/18314796/…
chodorowicz

4
@chodorowicz bu korkunç! Ben sadece VB sözdizimini biliyorum!
Sean Patrick Floyd

3
POST istekleri ile ilgili sorunlar yaşadım ama büyük harf "Application / json" ile çözüldü, bu yüzden 415 hatası alırsanız, büyük harf kullanımını kontrol edin.
WiteCastle

5
@ostrokach üzgünüm zamanını boşa harcadı. Sözdizimi, yayınladığımda OSX'de benim için iyi çalıştı (yeniden denemedim). Sanırım bu sadece bir platform farkıydı. Yukarı oyların yardımcı olduğu insanlardan olduğunu hayal ediyorum.
Adam Tuttle

564

Verilerinizi bir dosyaya koymaya çalışın, söyleyin body.jsonve kullanın

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

12
Muhtemelen --data-binaryyerine seçeneği kullanmalısınız --data. İstemci, verileri olduğu gibi göndermesini bekler, ancak --dataCR ve LF'yi girişten çıkarır.
h2stein

14
Satır içi json Strings ile cUrl kullanmak bir kabus gibi görünüyor. Çift tırnak karakterini değiştirmeye ihtiyaç var. Böyle bir dosya ile gitmek daha güzel.
Xtreme Biker

46
@Dosya adından önce bir karakter eklemek önemlidir , aksi takdirde çalışmaz. Ben sadece bu bok kafamı vurarak 20 dakika geçirdim ...
Radu Murzea

3
Bu şekilde, JSON ayrıştırılırken bir hata olup olmadığını görmek için dosyada bir JSON tiftiği çalıştırabilirsiniz.
datashaman

4
Windows'da, "@ body.json" dosya adının etrafında çift tırnak işareti kullanmanız gerekir
Stomf

100

Huzursuz bulabilirsin: https://github.com/micha/resty

Komut satırı REST isteklerini basitleştiren bir sarıcı yuvarlak CURL. API uç noktanıza yönlendirirsiniz ve size PUT ve POST komutları verir. (Ana sayfadan uyarlanmış örnekler)

$ 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

Ayrıca, İçerik Türü başlıklarının eklenmesi hala gereklidir. Bununla birlikte, site başına yöntem başına yapılandırma dosyası ekleme varsayılanını ayarlamak için bir kez yapabilirsiniz: Varsayılan RESTY seçeneklerini ayarlama


93

Windows için, -ddeğer için tek bir alıntıya sahip olmak benim için işe yaramadı, ancak çift tırnak olarak değiştirildikten sonra işe yaradı. Ayrıca kıvırcık parantez içinde çift tırnak kaçmak gerekiyordu.

Yani, aşağıdakiler işe yaramadı:

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

Ancak aşağıdakiler işe yaradı:

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

5
FYI - Json vücudu etrafında bir kapanış çift teklif eksik gibi görünüyor
acanby

3
Benim için Windows'da, "verilerin etrafında çalışmaz, tırnak işaretleri işe
yaramıyor

3
PowerShell kullanıyorsanız, bu yanıta bakın .
rsenna

86

Benim için çalıştı:

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

Bahar denetleyicisiyle mutlu bir şekilde eşlendi:

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

IdOnlyid özelliğine sahip basit bir POJO'dur .


56

Örnek olarak, bir JSON dosyası, params.json oluşturun ve bu içeriği buna ekleyin:

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

Sonra şu komutu çalıştırın:

curl -v -H "Content-Type: application/json" -X POST --data @params.json -u your_username:your_password http://localhost:8000/env/add_server

42

Ben sadece aynı problemle karşılaşıyorum. Belirterek çözebilirim

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

37

Bu benim için iyi çalıştı.

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

Nerede,

-X Http fiilini ifade eder.

--data Göndermek istediğiniz verileri ifade eder.


5
-X POSTBu örnekte gereksiz
Yazılım Mühendisi

31

Komutunuzu birleştirmek için Postman'ı sezgisel GUI ile kullanabilirsiniz cURL.

  1. Postacıyı Yükle ve Başlat
  2. URL'nizi, Gönderi Gövdesi, İstek Başlıkları vb. Yazın. S.
  3. Tıklamak Code
  4. Açılır cURLlisteden seçin
  5. cURLkomutunu kopyala ve yapıştır

Not: Açılır listede otomatik istek oluşturma için birkaç seçenek vardır, bu yüzden yazımın ilk başta gerekli olduğunu düşündüm.


6
Bu özelliğin Postacı'ya eklendiğini fark etmedim. Gösterdiğiniz için teşekkürler!
ariestav

29

CURL Windows kullanarak şunu deneyin:

curl -X POST -H "Content-Type:application/json" -d "{\"firstName\": \"blablabla\",\"lastName\": \"dummy\",\"id\": \"123456\"}" http-host/_ah/api/employeeendpoint/v1/employee

28

Postacıyı CURL'ye dönüştürmek için kullanabilirsinizresim açıklamasını buraya girin

resim açıklamasını buraya girin


1
Çok teşekkürler @ sonsuza kadar LA benim için bir hayat kurtarıcı ipucu oldu
vibs2006

24

HTTPie için önerilen bir alternatiftir curlçünkü

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

Varsayılan olarak JSON konuşuyor ve hem sizin için gerekli üstbilgiyi ayarlamayı hem de verileri geçerli JSON olarak kodlamayı işleyecek. Ayrıca birde şu var:

Some-Header:value

başlıklar için ve

name==value

sorgu dizesi parametreleri için. Büyük bir veri kümeniz varsa, JSON kodlanmış olması durumunda bir dosyadan da okuyabilirsiniz:

 field=@file.txt

20

RESTful arabirimine karşı çok sayıda JSON gönderme / yanıtını test ediyorsanız, Chrome için Postman eklentisine (web hizmeti testlerini manuel olarak tanımlamanıza izin verir) ve Node.js tabanlı Newman komutuna göz atmak isteyebilirsiniz. -line arkadaşı (Postman testlerinin "koleksiyonlarına" karşı testleri otomatikleştirmenizi sağlar.) Hem ücretsiz hem de açık!


18

Ek olarak BASIC kimlik doğrulamasını kullanarak bu benim için iyi çalıştı:

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

Tabii ki, hiçbir zaman SSL ve kontrol edilmiş bir sertifika olmadan BASIC kimlik doğrulamasını kullanmamalısınız.

Bugün yine Windows için Cygwin'in cURL 7.49.1'ini kullanarak tekrar karşılaştım ... Ve bir JSON argümanı kullanırken --dataveya kullanırken --data-binary, cURL karıştı ve JSON'da {}bir URL şablonu olarak yorumladı . -gCURL globbing'i kapatmak için bir argüman eklemek sorunu çözdü.

Ayrıca bkz . Köşeli ayraçlı bir URL geçirme .


17

JSON içeriğinizi bir dosyaya koyabilir ve aşağıdaki --file-uploadgibi standart girdi yoluyla seçeneği kullanarak kıvrılmaya geçirebilirsiniz :

 echo 'my.awesome.json.function({"do" : "whatever"})' | curl -X POST "http://url" -T -

16

Bu benim için çalıştı:

curl -H "Content-Type: application/json" -X POST -d @./my_json_body.txt http://192.168.1.1/json

10

Bir web sunucusu ile test etmek için aşağıdaki biçimi kullanıyorum.

use -F 'json data'

Bu JSON dict biçimini varsayalım:

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

Tam örnek

curl -XPOST your_address/api -F comment='{"who":"some_one", "desc":"get it"}'

6

Yük eklemek için -d seçeneğini kullanın

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

Ek olarak:

POST yöntemini kullanmak için -X POST kullanın

-H 'Kabul Et: application / json' kullanın ve kabul türü üstbilgisi ekleyin

içerik türü üstbilgisi eklemek için -H 'Content-Type: application / json' kullanın


Kullanmaya çalıştım ama {"hatalar" alıyorum: ["veri sağlanmadı"]} hatası.
Suresh

6

Bu benim için Windows10'da çalıştı

curl -d "{"""owner""":"""sasdasdasdasd"""}" -H "Content-Type: application/json" -X  PUT http://localhost:8080/api/changeowner/CAR4

5

Lütfen bu aracı kontrol edin . Kolayca kıvrılma parçacıkları oluşturmanıza yardımcı olur.

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"

5

Eklenecek dinamik verileriniz varsa, bunu yapmanın başka bir yolu.

#!/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"

1
Hayatımı kurtardın!
Abhimanyu


1

SWAGGER'ı bahar önyükleme uygulamanıza yapılandırırsanız ve uygulamanızdan herhangi bir API'yi çağırırsanız, o CURL İsteğini de görebilirsiniz.

Bu istekleri CURL aracılığıyla oluşturmanın kolay yolu olduğunu düşünüyorum.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.