Curl GET request dengan parameter json

124

Saya mencoba mengirim permintaan "GET" ke REST API jarak jauh dari Command Prompt melalui cURL seperti ini:

curl -X GET -H "Content-type: application/json" -H "Accept: application/json"  "http://server:5050/a/c/getName/{"param0":"pradeep"}"

Tapi tidak ada hasil. Saya mencoba melakukan ping ke URL langsung dari browser, saya berhasil mendapatkan respons, saya tidak mengerti apa yang salah dengan perintahnya.

Pada dasarnya saya ingin menetapkan permintaan "GET" ke layanan REST jarak jauh yang memberi saya data json sebagai respons melalui curl. Adakah yang bisa membimbing saya kesalahan apa yang saya lakukan? Saya mencoba berbagai posting, tetapi semuanya berbicara tentang permintaan POST bukan tentang GET.

Pradeep Simha
sumber
kesalahan apa yang diposting di sisi server Anda?
Wombat Menakutkan
Tidak ada kesalahan, sisi server berhasil dijalankan. Namun dari sisi curl tidak menampilkan data apapun. Itu hanya ping setelah beberapa detik itu hanya menampilkan kosong tanpa data.
Pradeep Simha
dapatkah Anda mencoba dengan curl -i -H "Accept: application / json" " server: 5050 / a / c / getName {" param0 ":" pradeep "}" (opsi -i bukan x).
Harshal Bulsara

Jawaban:

139

Ini harus bekerja:

  curl -i -H "Accept: application/json" 'server:5050/a/c/getName{"param0":"pradeep"}'

gunakan opsi -i, bukan x.

Harshal Bulsara
sumber
4
kutipan mungkin berbeda? "server: 5050 / a / c / getName {'param0': 'pradeep'}"
AB
Ini benar-benar harus 'server:5050/a/c/getName{"param0":"pradeep"}'atau "server:5050/a/c/getName{\"param0\":\"pradeep\"}".
Benjamin W.
16

Jika Anda ingin mengirim data Anda di dalam body, maka Anda harus membuat POSTatau PUTsebagai gantinya GET.

Bagi saya, sepertinya Anda mencoba mengirim kueri dengan parameter uri , yang tidak terkait dengan GET, Anda juga dapat meletakkan parameter ini POST, PUTdan seterusnya.

Kueri adalah bagian opsional, dipisahkan dengan tanda tanya ("?"), Yang berisi informasi identifikasi tambahan yang tidak bersifat hierarkis. Sintaks string kueri tidak ditentukan secara umum, tetapi biasanya disusun sebagai urutan pasangan =, dengan pasangan dipisahkan oleh titik koma atau ampersand.

Sebagai contoh:

curl http://server:5050/a/c/getName?param0=foo&param1=bar
Martin Seeler
sumber
7
Pesan permintaan HTTP apa pun diizinkan untuk memuat badan pesan. Ini tidak pernah berguna untuk GET karena semantik GET - konten isi permintaan, jika ada, tidak boleh mengubah respons.
Jarek Przygódzki
12

Jika Anda benar-benar ingin mengirimkan permintaan GET dengan JSON di dalam isi (katakanlah untuk permintaan XHR dan Anda tahu server mendukung pemrosesan isi pada permintaan GET), Anda dapat:

curl -X GET \
  -H "Content-type: application/json" \
  -H "Accept: application/json" \
  -d '{"param0":"pradeep"}' \
  "http://server:5050/a/c/getName"

Sebagian besar server web modern menerima jenis permintaan ini.

Steven Soroka
sumber
Ini tidak berhasil menghasilkan hasil yang diinginkan. Menggunakan httpbin.org/get untuk debugging, ini menghasilkan: { "args": {}, "headers": { "Accept": "application/json", "Content-Length": "20", "Content-Type": "application/json", "Host": "httpbin.org", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:57.0) Gecko/20100101 Firefox/57.0" }, "origin": "27.94.235.50, 27.94.235.50", "url": "https://httpbin.org/get" }Tidak ada yang diterima. Anda perlu menggunakan string kueri seperticurl -X GET https://httpbin.org/get?data=%7B%22param0%22%3A%22pradeep%22%7D
Jacques
Itu tergantung pada apakah server web Anda memeriksa tubuh untuk permintaan GET, yang saya akui bukan perilaku standar sepenuhnya. Anda mungkin lebih baik menggunakan parameter kueri url seperti yang Anda katakan. Satu masalah dengan menggunakan body on a get request adalah bahwa browser tidak dapat memutar ulang permintaan tersebut dengan menavigasi dengan riwayat browser, meskipun ini mungkin baik untuk permintaan XHR.
Steven Soroka
Alternatif lain yang dapat dilakukan, jika seseorang memiliki kontrol yang cukup di sisi server, adalah menambahkan properti khusus di data json seperti "method": "get", mengirim payload dalam permintaan posting dan meminta kode di server menafsirkannya sebagai permintaan get.
Jacques
@Jacques yakin, tetapi jika Anda memiliki kendali atas server, Anda dapat dengan mudah meminta server Anda membaca badan permintaan GET. Kembali ke pertanyaan awal, saya pikir keseluruhan garis singgung ini sedikit keluar dari topik. Membaca ulang pertanyaan, saya rasa OP tidak memiliki akses untuk mengubah server.
Steven Soroka
ya itu benar. Jika Anda mengontrol server. Komentar saya didorong oleh pernyataan berikut yang Anda buat yang, seperti yang saya katakan, tidak akan memberikan hasil yang diinginkan: "Sebagian besar server web modern menerima jenis permintaan ini". Sebenarnya, mereka akan menerima permintaan yang Anda jelaskan, tetapi permintaan tersebut akan gagal memberikan hasil yang diinginkan. Atau Anda mungkin ingin merevisi pernyataan seperti ini: "Sebagian besar server web modern menerima jenis permintaan ini dengan asumsi Anda memiliki kontrol langsung di sisi server, tetapi ini tidak standar"
Jacques
8

GET mengambil pasangan nilai nama.

Cobalah sesuatu seperti:

curl http://server:5050/a/c/getName/?param1=pradeep

atau

curl http://server:5050/a/c/getName?param1=pradeep

btw REST biasa akan terlihat seperti

curl http://server:5050/a/c/getName/pradeep Jika menggunakan JSON di GET URL, ini bukan cara standar.

pengguna2877889
sumber
4

Untuk layanan yang dilindungi nama pengguna dan kata sandi gunakan yang berikut ini

curl -u admin:password -X GET http://172.16.2.125:9200 -d '{"sort":[{"lastUpdateTime":{"order":"desc"}}]}'
Sandeep KV
sumber
curl -X POST -H "Content-type: application / json" -d '{"stuff": "things"}' http: // ...
keithpjolley
Koreksi saya jika saya salah, tetapi memiliki -d pada permintaan curl (dan tidak menentukan metode) akan membuat permintaan menjadi POST.
Gokigooooks
3

Mencoba

curl -G ...

dari pada

curl -X GET ...

Biasanya Anda tidak memerlukan opsi ini. Semua jenis permintaan GET, HEAD, POST dan PUT lebih sering dipanggil dengan menggunakan opsi baris perintah khusus.

Opsi ini hanya mengubah kata sebenarnya yang digunakan dalam permintaan HTTP, ini tidak mengubah cara berperilaku curl. Jadi misalnya jika Anda ingin membuat permintaan HEAD yang benar, menggunakan -X HEAD tidak akan cukup. Anda perlu menggunakan opsi -I, --head.

smci
sumber
1

Tidak ada solusi yang disebutkan di atas yang berhasil untuk saya karena beberapa alasan. Inilah solusi saya. Ini cukup mendasar.

curl -X GET API_ENDPOINT -H 'Jenis-Konten: application / json' -d ' JSON_DATA '

API_ENDPOINT adalah titik akhir api Anda, misalnya: http://127.0.0.1:80/api

-H Telah digunakan untuk menambahkan konten header.

JSON_DATA adalah isi permintaan Anda, bisa jadi seperti ini :: {"data_key": "value"}. '' di sekitar JSON_DATA itu penting.

Apa pun setelah -d adalah data yang perlu Anda kirimkan dalam permintaan GET

bhatman
sumber