Json parametresiyle Curl GET isteği


124

Komut İstemi'nden uzak bir REST API'ye cURL aracılığıyla aşağıdaki gibi bir "GET" isteği göndermeye çalışıyorum:

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

Ancak çıktı vermez. URL'ye doğrudan tarayıcıdan ping atmaya çalıştım, başarılı bir şekilde yanıt alabiliyorum, komutta neyin yanlış olduğunu anlamıyorum.

Temel olarak uzak bir REST hizmetine bir "GET" isteği ayarlamak istiyorum, bu da bana curl yoluyla bir yanıt olarak json verisi veriyor. Biri bana hangi hatayı yaptığıma rehberlik edebilir mi? Çeşitli gönderileri denedim, ancak hepsi GET hakkında değil POST isteklerinden bahsediyor.


sunucu tarafınızda hangi hatalar yayınlanıyor?
Korkunç Wombat

Hata yok, sunucu tarafında başarıyla yürütülüyor. Ancak kıvrılma tarafından herhangi bir veri göstermiyor. Sadece birkaç saniye sonra ping atıyor, veri olmadan boş görünüyor.
Pradeep Simha

curl -i -H ile deneyebilir misin? "Kabul et: uygulama / json" " sunucu: 5050 / a / c / getName {" param0 ":" pradeep "}" (x yerine seçenek -i).
Harşal Bulsara

Yanıtlar:


139

Bu çalışmalı :

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

x yerine -i seçeneğini kullanın.


4
belki farklı bir alıntı? "server: 5050 / a / c / getName {'param0': 'pradeep'}"
AB

Gerçekten ya 'server:5050/a/c/getName{"param0":"pradeep"}'da olmalı "server:5050/a/c/getName{\"param0\":\"pradeep\"}".
Benjamin W.

16

Verilerinizi gövdenin içine göndermek istiyorsanız, yerine POSTveya PUTyerine a yapmanız gerekir GET.

Göndermeye çalıştığınız gibi benim için, görünüşe uri parametrelerle sorgu ilişkili değildir, GET, ayrıca ilgili bu parametreleri koyabilirsiniz POST, PUTvb.

Sorgu, doğası gereği hiyerarşik olmayan ek kimlik bilgileri içeren, soru işaretiyle ("?") Ayrılmış isteğe bağlı bir parçadır. Sorgu dizesi sözdizimi genel olarak tanımlanmamıştır, ancak genellikle çiftler noktalı virgül veya ve işareti ile ayrılmış olarak bir dizi = çift olarak düzenlenir.

Örneğin:

curl http://server:5050/a/c/getName?param0=foo&param1=bar

7
Herhangi bir HTTP istek mesajının bir mesaj gövdesi içermesine izin verilir. GET semantiği nedeniyle GET için hiçbir zaman yararlı değildir - eğer varsa istek gövdesinin içeriği yanıtı değiştirmemelidir.
Jarek Przygódzki

12

Gövdedeki JSON ile GET isteğini gerçekten göndermek istiyorsanız (örneğin bir XHR isteği için ve sunucunun GET isteklerinde gövdeyi işlemeyi desteklediğini biliyorsanız), şunları yapabilirsiniz:

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

Çoğu modern web sunucusu bu tür istekleri kabul eder.


Bu, amaçlanan sonucu üretmez. Kullanımı httpbin.org/get hata ayıklama için, bu verimleri: { "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" }Hiçbir şey alınır. Gibi bir sorgu dizesi kullanmanız gerekircurl -X GET https://httpbin.org/get?data=%7B%22param0%22%3A%22pradeep%22%7D
Jacques

Bu, web sunucunuzun gövdeyi GET istekleri için kontrol edip etmediğine bağlıdır, ki bunun tamamen standart bir davranış olmadığını kabul ediyorum. Söylediğiniz gibi url sorgu parametrelerini kullanmanız daha iyi olabilir. Bir alma isteğinde bir gövde kullanmakla ilgili bir sorun, tarayıcının isteği tarayıcı geçmişinde gezinerek yeniden oynatamamasıdır, ancak bu muhtemelen XHR istekleri için uygundur.
Steven Soroka

Alternatif olarak, sunucu tarafında yeterli kontrole sahip bir kişinin yapabileceği şey, json verilerine "method": "get" gibi özel bir özellik eklemek, yükü bir post isteğinde göndermek ve sunucudaki kodun bunu yorumlamasını sağlamaktır. istek olarak.
Jacques

@ Jacques elbette, ancak sunucunun kontrolüne sahipseniz, sunucunuzun GET isteklerinin gövdelerini okumasını da sağlayabilirsiniz. Asıl soruya geri dönersek, bence tüm bu teğet biraz konu dışı. Soruyu tekrar okuduktan sonra, OP'nin sunucuyu değiştirme erişimi olduğunu sanmıyorum.
Steven Soroka

Evet bu doğru. Sunucuyu kontrol ediyorsanız. Yorumum, yaptığın şu ifade ile teşvik edildi ve bu, daha önce de söylediğim gibi, istenen sonucu vermedi: "Çoğu modern web sunucusu bu tür bir isteği kabul ediyor". Aslında, tanımladığınız talebi kabul edeceklerdi, ancak talep istenen sonucu vermeyecektir. Ya da şu ifadeyi gözden geçirmek isteyebilirsiniz: "Çoğu modern web sunucusu, sunucu tarafında doğrudan kontrole sahip olduğunuzu varsayarak bu tür istekleri kabul eder, ancak bu standart değildir"
Jacques

8

GET, ad değer çiftlerini alır.

Şöyle bir şey dene:

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

veya

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

btw normal bir REST şunun gibi görünmelidir:

curl http://server:5050/a/c/getName/pradeep GET URL'de JSON alırsa, bu standart bir yol değildir.


4

Kullanıcı adı ve şifre korumalı hizmetler için aşağıdakileri kullanın

curl -u admin:password -X GET http://172.16.2.125:9200 -d '{"sort":[{"lastUpdateTime":{"order":"desc"}}]}'

curl -X POST -H "İçerik türü: uygulama / json" -d '{"malzeme": "şeyler"}' http: // ...
keithpjolley

Yanılıyorsam düzelt, ancak bir curl isteğinde -d'ye sahip olmak (ve yöntemi belirtmeden) isteği bir POST yapacaktır.
Gokigooooks

3

Deneyin

curl -G ...

onun yerine

curl -X GET ...

Normalde bu seçeneğe ihtiyacınız yoktur. Her tür GET, HEAD, POST ve PUT istekleri daha çok özel komut satırı seçenekleri kullanılarak çağrılır.

Bu seçenek yalnızca HTTP isteğinde kullanılan gerçek sözcüğü değiştirir, curl'nin davranış şeklini değiştirmez. Örneğin, uygun bir HEAD isteğinde bulunmak istiyorsanız, -X HEAD kullanmak yeterli olmayacaktır. -I, --head seçeneğini kullanmanız gerekir.


1

Yukarıda belirtilen çözümlerin hiçbiri bir nedenden dolayı benim için işe yaramadı. İşte benim çözümüm. Oldukça basit.

curl -X GET API_ENDPOINT -H 'İçerik Türü: uygulama / json' -d ' JSON_DATA '

API_ENDPOINT , api uç noktanızdır , örneğin: http://127.0.0.1:80/api

-H başlık içeriği eklemek için kullanıldı.

JSON_DATA , isteğinizin gövdesidir ve :: {"data_key": "değer"} gibi bir şey olabilir. '' JSON_DATA'yı çevrelemek önemlidir.

Sonra her şey -d GET isteğinde göndermek için gereken verileri ise

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.