JSON पैरामीटर के साथ कर्ल GET अनुरोध


124

मैं इस तरह से CURL के माध्यम से कमांड प्रॉम्प्ट से दूरस्थ REST API के लिए "GET" अनुरोध भेजने का प्रयास कर रहा हूं:

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

लेकिन यह कोई आउटपुट नहीं देता है। मैंने ब्राउज़र से सीधे URL को पिंग करने की कोशिश की, मैं सफलतापूर्वक प्रतिक्रिया प्राप्त करने में सक्षम हूं, मुझे समझ नहीं आ रहा है कि कमांड के साथ क्या गलत है।

मूल रूप से मैं दूरस्थ REST सेवा के लिए "GET" अनुरोध सेट करना चाहता हूं जो कर्ल के माध्यम से प्रतिक्रिया के रूप में मुझे json डेटा देता है। क्या कोई मुझे मार्गदर्शन दे सकता है कि मैं क्या गलती कर रहा हूं? मैंने विभिन्न पदों की कोशिश की, लेकिन उनमें से सभी पोस्ट के बारे में बात करते हैं, जीईटी के बारे में नहीं।


आपके सर्वर की ओर से कौन सी त्रुटियां पोस्ट की जा रही हैं?
डरावना वोमेट

कोई त्रुटि नहीं, सर्वर साइड इसे सफलतापूर्वक निष्पादित कर रहा है। लेकिन कर्ल की तरफ से यह किसी भी तरह का प्रदर्शन नहीं कर रहा है। यह सिर्फ कुछ सेकंड के बाद पिंग करता है, यह सिर्फ बिना डेटा के रिक्त दिखाता है।
प्रदीप सिंह

क्या आप कर्ल-आई-एच के साथ कोशिश कर सकते हैं "स्वीकार करें: एप्लिकेशन / जसन " " सर्वर: 5050 / a / c / getName {" param0 ":" प्रदीप "}" (विकल्प -i बजाय x)।
हर्षल बुल्सारा

जवाबों:


139

यह काम करना चाहिए:

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

x के बजाय विकल्प -i का उपयोग करें।


4
शायद अलग उद्धरण? "सर्वर: 5050 / a / c / getName {'param0': 'प्रदीप'}"
AB

यह वास्तव में या तो होना चाहिए 'server:5050/a/c/getName{"param0":"pradeep"}'या "server:5050/a/c/getName{\"param0\":\"pradeep\"}"
बेंजामिन डब्ल्यू

16

यदि आप अपना डेटा शरीर के अंदर भेजना चाहते हैं, तो आपको एक POSTया PUTइसके बजाय बनाना होगा GET

मेरे लिए, ऐसा लगता है कि आप उरी मापदंडों के साथ क्वेरी भेजने की कोशिश कर रहे हैं , जो संबंधित नहीं है GET, आप इन मापदंडों को भी डाल सकते हैं POST, PUTऔर इसी तरह।

प्रश्न एक वैकल्पिक भाग है, जिसे प्रश्न चिह्न ("?") द्वारा अलग किया गया है, जिसमें अतिरिक्त पहचान की जानकारी है जो प्रकृति में पदानुक्रमित नहीं है। क्वेरी स्ट्रिंग सिंटैक्स को सामान्य रूप से परिभाषित नहीं किया जाता है, लेकिन इसे आमतौर पर = जोड़े के अनुक्रम के रूप में आयोजित किया जाता है, जिसमें जोड़े एक अर्धविराम या एक एम्परसेंड द्वारा अलग होते हैं।

उदाहरण के लिए:

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

7
किसी भी HTTP अनुरोध संदेश में एक संदेश निकाय सम्‍मिलित है। यह GET शब्दार्थ के कारण GET के लिए कभी भी उपयोगी नहीं है - अनुरोध निकाय की सामग्री, यदि कोई हो, तो प्रतिक्रिया में परिवर्तन नहीं होना चाहिए।
जारेक प्रोजगोडकी

12

यदि आप वास्तव में JSON के साथ शरीर में GET अनुरोध सबमिट करना चाहते हैं (XHR अनुरोध के लिए कहें और आपको पता है कि सर्वर GET अनुरोधों पर शरीर को संसाधित करने का समर्थन करता है), तो आप कर सकते हैं:

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

अधिकांश आधुनिक वेब सर्वर इस प्रकार के अनुरोध को स्वीकार करते हैं।


यह इच्छित परिणाम का उत्पादन नहीं करता है। डिबगिंग के लिए httpbin.org/get का उपयोग करके , यह पैदावार: { "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" }कुछ भी प्राप्त नहीं होता है। आपको एक क्वेरी स्ट्रिंग का उपयोग करने की आवश्यकता है जैसेcurl -X GET https://httpbin.org/get?data=%7B%22param0%22%3A%22pradeep%22%7D
जैक्स

यह इस बात पर निर्भर करता है कि आपका वेब सर्वर GET अनुरोधों के लिए शरीर की जांच कर रहा है या नहीं, जो मैं मानता हूं कि यह पूरी तरह से मानक व्यवहार नहीं है। आप अपने कहे अनुसार url क्वेरी पैरामीटर का उपयोग करके बेहतर हो सकते हैं। एक अनुरोध पर एक निकाय का उपयोग करने के साथ एक मुद्दा यह है कि ब्राउज़र ब्राउज़र इतिहास के साथ नेविगेट करके अनुरोध को फिर से नहीं कर सकता है, हालांकि यह शायद XHR अनुरोधों के लिए ठीक है।
स्टीवन सोरोका

वैकल्पिक रूप से कोई क्या कर सकता है, यदि किसी का सर्वर साइड पर पर्याप्त नियंत्रण है, तो "विधि": "प्राप्त करें" जैसे जैसन डेटा में एक विशेष गुण जोड़ते हैं, पोस्ट अनुरोध में पेलोड भेजें और सर्वर पर कोड की व्याख्या करें एक अनुरोध के रूप में।
जैक्स

@Jacques यकीन है, लेकिन अगर आपके पास सर्वर का नियंत्रण है तो आप आसानी से अपने सर्वर को GET अनुरोधों के निकाय पढ़ सकते हैं। मूल प्रश्न पर वापस जाना, मुझे लगता है कि यह पूरी स्पर्शरेखा थोड़ा बंद विषय है। प्रश्न को फिर से पढ़ना, मुझे नहीं लगता कि ओपी के पास सर्वर को बदलने की पहुंच है।
स्टीवन सोरोका

हाँ यह सच है। यदि आप सर्वर को नियंत्रित करते हैं। मेरी टिप्पणी आपके द्वारा किए गए निम्न कथन से प्रेरित थी, जैसा कि मैंने कहा, इसका इरादा परिणाम नहीं होगा: "अधिकांश आधुनिक वेब सर्वर इस प्रकार के अनुरोध को स्वीकार करते हैं"। वास्तव में, वे आपके द्वारा बताए गए अनुरोध को स्वीकार कर लेंगे, लेकिन अनुरोध इच्छित परिणाम देने में विफल होगा। या आप इस तरह के बयान को संशोधित करना चाह सकते हैं: "अधिकांश आधुनिक वेब सर्वर इस प्रकार के अनुरोध को स्वीकार करते हैं कि आपके पास सर्वर पर सीधा नियंत्रण है, लेकिन यह गैर-मानक है"
जैक्स

8

GET नाम मान युग्म लेता है।

कुछ इस तरह की कोशिश करें:

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

या

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

btw एक नियमित बाकी कुछ की तरह दिखना चाहिए

curl http://server:5050/a/c/getName/pradeep यदि यह JSON को GET URL में लेता है, तो यह एक मानक तरीका नहीं है।


4

उपयोगकर्ता नाम और पासवर्ड के लिए संरक्षित सेवाएँ निम्नलिखित का उपयोग करती हैं

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

कर्ल -X POST -H "सामग्री-प्रकार: अनुप्रयोग / json" -d '{"सामान": "चीजें"}' http: // ...
कीथपजोल्ले

मुझे सही है अगर मैं गलत हूँ, लेकिन एक कर्ल अनुरोध पर -d (और विधि निर्दिष्ट नहीं) अनुरोध एक पोस्ट कर देगा।
गोकिगूक्स

3

प्रयत्न

curl -G ...

के बजाय

curl -X GET ...

आम तौर पर आपको इस विकल्प की आवश्यकता नहीं होती है। GET, HEAD, POST और PUT अनुरोधों के सभी प्रकार समर्पित कमांड लाइन विकल्पों का उपयोग करके लागू किए जाते हैं।

यह विकल्प केवल HTTP अनुरोध में उपयोग किए जाने वाले वास्तविक शब्द को बदलता है, यह कर्ल के व्यवहार के तरीके को नहीं बदलता है। इसलिए उदाहरण के लिए यदि आप एक उचित HEAD अनुरोध करना चाहते हैं, तो -X HEAD का उपयोग करना पर्याप्त नहीं होगा। आपको -I, --head विकल्प का उपयोग करना होगा।


1

उपर्युक्त किसी भी समाधान ने किसी कारण से मेरे लिए काम नहीं किया। यहाँ मेरा समाधान है। यह बहुत बुनियादी है।

कर्ल -X प्राप्त API_ENDPOINT एच 'सामग्री प्रकार: आवेदन / json' -d ' JSON_DATA '

API_ENDPOINT आपका एपि समापन बिंदु है जैसे: http://127.0.0.1:80/api

-H का उपयोग हेडर कंटेंट को जोड़ने के लिए किया गया है।

JSON_DATA आपके अनुरोध का मुख्य भाग है, यह कुछ ऐसा हो सकता है जैसे :: {"data_key": "value"}। '' आसपास के JSON_DATA महत्वपूर्ण हैं।

के बाद कुछ भी -d डेटा जो आप GET अनुरोध में भेजने की जरूरत है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.