Bagaimana cara POST data JSON dengan cURL?

2834

Saya menggunakan Ubuntu dan menginstal CURL di atasnya. Saya ingin menguji aplikasi Spring REST saya dengan CURL. Saya menulis kode POST saya di sisi Java. Namun, saya ingin mengujinya dengan CURL. Saya mencoba memposting data JSON. Contoh data seperti ini:

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

Saya menggunakan perintah ini:

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

Ini mengembalikan kesalahan ini:

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

Deskripsi kesalahannya adalah ini:

Server menolak permintaan ini karena entitas permintaan dalam format yang tidak didukung oleh sumber daya yang diminta untuk metode yang diminta ().

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

Apa format yang benar dari perintah cURL?

Ini adalah PUTkode sisi Java saya (saya telah menguji GET dan DELETE dan mereka bekerja):

@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
sumber
6
checkout tautan untuk permintaan pos pegas 3.2.0.
AmirHd
8
Ada posting yang bagus Menggunakan Curl Untuk Pengujian Ad Hoc Of RESTful Microservices yang mencakup ini dengan beberapa contoh.
upitau

Jawaban:

4342

Anda perlu mengatur tipe konten Anda ke aplikasi / json. Tetapi -dmengirimkan Tipe-Kontenapplication/x-www-form-urlencoded , yang tidak diterima di sisi Spring.

Melihat halaman manual ikal , saya pikir Anda dapat menggunakan -H:

-H "Content-Type: application/json"

Contoh lengkap:

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

( -Hkependekan dari --header, -duntuk --data)

Perhatikan bahwa -request POSTitu opsional jika Anda menggunakan -d, karena -dbendera menyiratkan permintaan POST.


Di Windows, segalanya sedikit berbeda. Lihat utas komentar.

Sean Patrick Floyd
sumber
262
Untuk windows, tanda kutip tunggal di sekitar json tidak bekerja dan saya akhirnya lolos tanda kutip ganda. curl -X POST -H "Content-Type: application/json" -d "{ \"key1\": \"value1\" }" http://localhost:3000/api/method
hIpPy
37
Bagi saya di bawah Windows saya harus keluar dari kutipan menggunakan kutipan dalam format ini "{ """key1""": """value1""" }". Juga jawaban ini: stackoverflow.com/questions/18314796/…
chodorowicz
4
@chodorowicz itu mengerikan! Saya hanya tahu sintaks itu dari VB!
Sean Patrick Floyd
3
Saya memiliki masalah dengan permintaan POST tetapi menyelesaikannya dengan huruf besar "Aplikasi / json" jadi jika Anda mendapatkan kesalahan 415, periksa kapitalisasi.
WiteCastle
5
@ postrokach maaf itu membuang-buang waktu Anda Sintaks bekerja dengan baik untuk saya di OSX ketika saya mempostingnya (belum coba lagi). Kira itu / hanya perbedaan platform. Saya membayangkan upvotes dari orang-orang yang membantu.
Adam Tuttle
565

Cobalah untuk memasukkan data Anda dalam file, katakan body.jsondan kemudian gunakan

curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf
Typisch
sumber
12
Anda mungkin harus menggunakan --data-binaryopsi sebagai gantinya --data. Orang akan berharap bahwa klien mengirim data apa adanya, tetapi --datamenghapus CR dan LF dari input.
h2stein
14
Menggunakan cUrl dengan inline json Strings tampaknya menjadi mimpi buruk. Ada kebutuhan untuk mencetak karakter kutipan ganda. Pergi dengan file seperti ini lebih baik.
Xtreme Biker
46
Penting untuk menambahkan @karakter sebelum nama file, jika tidak maka tidak akan berfungsi. Saya hanya menghabiskan 20 menit membenturkan kepalaku ke omong kosong ini ...
Radu Murzea
3
Dengan cara ini Anda juga dapat menjalankan serat JSON pada file untuk melihat apakah ada kesalahan dalam mengurai JSON.
datashaman
4
Di Windows, Anda perlu tanda kutip ganda di sekitar nama file "@ body.json"
Stomf
100

Anda mungkin menemukan resty berguna: https://github.com/micha/resty

Ini adalah pembungkus bulat CURL yang menyederhanakan permintaan REST baris perintah. Anda arahkan ke titik akhir API Anda, dan itu memberi Anda perintah PUT dan POST. (Contoh diadaptasi dari beranda)

$ 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

Selain itu, sering kali masih perlu menambahkan header Jenis Konten. Anda dapat melakukan ini satu kali, untuk menetapkan default, menambahkan file config per-metode per-situs: Mengatur opsi RESTY default

mo-seph
sumber
93

Untuk Windows, memiliki satu kutipan untuk -dnilai tidak bekerja untuk saya, tetapi itu berhasil setelah berubah menjadi dua kali lipat. Saya juga perlu menghindari tanda kutip ganda di dalam kurung keriting.

Artinya, berikut ini tidak berfungsi:

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

Tetapi yang berikut ini berhasil:

curl -i -X POST -H "Content-Type: application/json" -d "{\"key\":\"val\"}" http://localhost:8080/appname/path
venkatnz
sumber
5
FYI - sepertinya Anda melewatkan penawaran ganda penutupan di sekitar json body
acanby
3
Bagi saya di Windows, "di sekitar data tidak berfungsi, tidak ada tanda kutip yang berfungsi
rodedo
3
Jika Anda menggunakan PowerShell, lihat jawaban ini .
rsenna
86

Ini berhasil bagi saya menggunakan:

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

Itu dengan senang hati dipetakan ke controller 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";
}

IdOnlyadalah POJO sederhana dengan properti id.

Luis
sumber
56

Sebagai contoh, buat file JSON, params.json, dan tambahkan konten ini ke dalamnya:

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

Kemudian Anda menjalankan perintah ini:

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
sumber
42

Saya hanya mengalami masalah yang sama. Saya bisa menyelesaikannya dengan menentukan

-H "Content-Type: application/json; charset=UTF-8"
Steffen Roller
sumber
37

Ini bekerja dengan baik untuk saya.

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

Dimana,

-X Berarti kata kerja http.

--data Berarti data yang ingin Anda kirim.

felipealvesgnu
sumber
5
Ini -X POSTberlebihan dalam contoh ini
Insinyur Perangkat Lunak
31

Anda dapat menggunakan tukang pos dengan GUI intuitifnya untuk merakit cURLperintah Anda .

  1. Instal dan Mulai Postman
  2. Ketik URL Anda, Badan Pos, Tajuk Permintaan dll. Hlm.
  3. Klik Code
  4. Pilih cURLdari daftar drop-down
  5. salin & tempel cURLperintah Anda

Catatan: Ada beberapa opsi untuk pembuatan permintaan otomatis dalam daftar drop-down, itulah mengapa saya pikir posting saya perlu di tempat pertama.

kiltek
sumber
6
Tidak menyadari bahwa fitur itu termasuk dalam Postman. Terima kasih telah menunjukkannya!
ariestav
29

Menggunakan CURL Windows, coba ini:

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
sumber
28

Anda dapat menggunakan tukang pos untuk mengonversi ke CURLmasukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

byte mamba
sumber
1
Terima kasih banyak @ selamanya-LA itu adalah tip penyelamat bagi saya
vibs2006
24

HTTPie adalah alternatif yang disarankan curlkarena Anda bisa melakukannya dengan adil

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

Ini berbicara JSON secara default dan akan menangani pengaturan header yang diperlukan untuk Anda serta menyandikan data sebagai JSON yang valid. Ada juga:

Some-Header:value

untuk header, dan

name==value

untuk parameter string kueri. Jika Anda memiliki banyak data, Anda juga dapat membacanya dari file yang dikodekan JSON:

 field=@file.txt
omong kosong
sumber
20

Jika Anda menguji banyak pengiriman / respons JSON terhadap antarmuka RESTful, Anda mungkin ingin memeriksa plug-in Postman untuk Chrome (yang memungkinkan Anda untuk menentukan tes layanan web secara manual) dan perintah Newman berbasis Node.js-nya pendamping-line (yang memungkinkan Anda untuk mengotomatisasi tes terhadap "koleksi" tes Postman.) Baik gratis dan terbuka!

ftexperts
sumber
18

Ini bekerja dengan baik untuk saya, tambahan menggunakan otentikasi 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

Tentu saja, Anda tidak boleh menggunakan otentikasi BASIC tanpa SSL dan sertifikat yang diperiksa.

Saya mengalami hal ini lagi hari ini, menggunakan cURL 7.49.1 untuk Windows Cygwin ... Dan ketika menggunakan --dataatau --data-binarydengan argumen JSON, cURL menjadi bingung dan akan menafsirkannya {}di JSON sebagai templat URL. Menambahkan -gargumen untuk mematikan globbing cURL memperbaikinya.

Lihat juga Melewati URL dengan tanda kurung untuk digulung .

davenpcj
sumber
17

Anda juga bisa meletakkan konten JSON Anda di file dan meneruskannya ke curl menggunakan --file-uploadopsi melalui input standar, seperti ini:

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

Ini bekerja untuk saya:

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

Saya menggunakan format di bawah ini untuk menguji dengan server web.

use -F 'json data'

Mari kita asumsikan format dikt JSON ini:

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

Contoh lengkap

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

Gunakan opsi -d untuk menambahkan muatan

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

Sebagai tambahan:

gunakan -X POST untuk menggunakan metode POST

gunakan -H 'Terima: aplikasi / json' untuk menambahkan header jenis terima

gunakan -H 'Content-Type: application / json' untuk menambahkan header tipe konten

Sma Ma
sumber
Saya mencoba menggunakannya tetapi mendapatkan kesalahan {"error": ["tidak ada data yang disediakan"]}.
Suresh
6

Silakan periksa alat ini . Ini membantu Anda untuk membuat potongan ikal dengan mudah.

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
sumber
6

Ini bekerja untuk saya di Windows10

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

Berikut ini cara lain untuk melakukannya, jika Anda memiliki data dinamis untuk dimasukkan.

#!/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
sumber
1
Kau telah menyelamatkan hidupku!
Abhimanyu
4

Saya tahu, banyak yang telah dijawab untuk pertanyaan ini tetapi ingin berbagi di mana saya memiliki masalah:

curl -X POST http: // titik akhir server Anda -H "Tipe Konten: application / json" -d @ path-of-your-json-file.json

Lihat, aku melakukan semuanya dengan benar, Hanya satu hal - "@" Saya melewatkan sebelum jalur file JSON.

Saya menemukan satu dokumen masuk yang relevan di internet - https://gist.github.com/subfuzion/08c5d85437d5d4f00e58

Semoga itu bisa membantu beberapa orang. Terima kasih

Kamu Menakjubkan
sumber
1

Jika Anda mengkonfigurasi SWAGGER ke aplikasi booting musim semi Anda, dan menjalankan API apa pun dari aplikasi Anda di sana, Anda juga dapat melihat Permintaan CURL itu.

Saya pikir ini adalah cara mudah untuk menghasilkan permintaan melalui CURL.

AnilkumarReddy
sumber