बैश स्क्रिप्ट फ़ंक्शन में परिभाषित चर के साथ कर्ल POST का उपयोग करना


176

जब मैं गूंजता है तो मुझे यह मिलता है, जो टर्मिनल में प्रवेश करते समय चलता है

curl -i \
-H "Accept: application/json" \
-H "Content-Type:application/json" \
-X POST --data '{"account":{"email":"akdgdtk@test.com","screenName":"akdgdtk","type":"NIKE","passwordSettings":{"password":"Starwars1","passwordConfirm":"Starwars1"}},"firstName":"Test","lastName":"User","middleName":"ObiWan","locale":"en_US","registrationSiteId":"520","receiveEmail":"false","dateOfBirth":"1984-12-25","mobileNumber":"9175555555","gender":"male","fuelActivationDate":"2010-10-22","postalCode":"10022","country":"US","city":"Beverton","state":"OR","bio":"This is a test user","jpFirstNameKana":"unsure","jpLastNameKana":"ofthis","height":"80","weight":"175","distanceUnit":"MILES","weightUnit":"POUNDS","heightUnit":"FT/INCHES"}' https://xxx:xxxxx@xxxx-www.xxxxx.com/xxxxx/xxxx/xxxx

लेकिन जब bash स्क्रिप्ट फ़ाइल में चलाया जाता है, तो मुझे यह त्रुटि मिलती है

curl: (6) Could not resolve host: application; nodename nor servname provided, or not known
curl: (6) Could not resolve host: is; nodename nor servname provided, or not known
curl: (6) Could not resolve host: a; nodename nor servname provided, or not known
curl: (6) Could not resolve host: test; nodename nor servname provided, or not known
curl: (3) [globbing] unmatched close brace/bracket at pos 158

यह फ़ाइल में कोड है

curl -i \
-H '"'Accept: application/json'"' \
-H '"'Content-Type:application/json'"' \
-X POST --data "'"'{"account":{"email":"'$email'","screenName":"'$screenName'","type":"'$theType'","passwordSettings":{"password":"'$password'","passwordConfirm":"'$password'"}},"firstName":"'$firstName'","lastName":"'$lastName'","middleName":"'$middleName'","locale":"'$locale'","registrationSiteId":"'$registrationSiteId'","receiveEmail":"'$receiveEmail'","dateOfBirth":"'$dob'","mobileNumber":"'$mobileNumber'","gender":"'$gender'","fuelActivationDate":"'$fuelActivationDate'","postalCode":"'$postalCode'","country":"'$country'","city":"'$city'","state":"'$state'","bio":"'$bio'","jpFirstNameKana":"'$jpFirstNameKana'","jpLastNameKana":"'$jpLastNameKana'","height":"'$height'","weight":"'$weight'","distanceUnit":"MILES","weightUnit":"POUNDS","heightUnit":"FT/INCHES"}'"'" "https://xxx:xxxxx@xxxx-www.xxxxx.com/xxxxx/xxxx/xxxx"

मुझे लगता है कि मेरे उद्धरण चिह्नों के साथ एक समस्या है, लेकिन मैं उनके साथ बहुत खेल चुका हूं और मुझे ऐसी ही त्रुटियां मिली हैं। सभी चर वास्तविक स्क्रिप्ट में विभिन्न कार्यों के साथ परिभाषित किए गए हैं

जवाबों:


274

आपको कस्टम हेडर को कर्ल करने के लिए संलग्न उद्धरण पास करने की आवश्यकता नहीं है। इसके अलावा, dataतर्क के बीच में आपके चर को उद्धृत किया जाना चाहिए।

सबसे पहले, एक फ़ंक्शन लिखें जो आपकी स्क्रिप्ट के पोस्ट डेटा को उत्पन्न करता है। यह आपको शेल उद्धरण से संबंधित सभी प्रकार के सिरदर्द से बचाता है और आपके प्रयास के अनुसार कर्ल की इनवोकेशन लाइन पर पोस्ट डेटा को फीड करने की तुलना में स्क्रिप्ट को बनाए रखना आसान बनाता है:

generate_post_data()
{
  cat <<EOF
{
  "account": {
    "email": "$email",
    "screenName": "$screenName",
    "type": "$theType",
    "passwordSettings": {
      "password": "$password",
      "passwordConfirm": "$password"
    }
  },
  "firstName": "$firstName",
  "lastName": "$lastName",
  "middleName": "$middleName",
  "locale": "$locale",
  "registrationSiteId": "$registrationSiteId",
  "receiveEmail": "$receiveEmail",
  "dateOfBirth": "$dob",
  "mobileNumber": "$mobileNumber",
  "gender": "$gender",
  "fuelActivationDate": "$fuelActivationDate",
  "postalCode": "$postalCode",
  "country": "$country",
  "city": "$city",
  "state": "$state",
  "bio": "$bio",
  "jpFirstNameKana": "$jpFirstNameKana",
  "jpLastNameKana": "$jpLastNameKana",
  "height": "$height",
  "weight": "$weight",
  "distanceUnit": "MILES",
  "weightUnit": "POUNDS",
  "heightUnit": "FT/INCHES"
}
EOF
}

कर्ल के आह्वान में उस फ़ंक्शन का उपयोग करना आसान है:

curl -i \
-H "Accept: application/json" \
-H "Content-Type:application/json" \
-X POST --data "$(generate_post_data)" "https://xxx:xxxxx@xxxx-www.xxxxx.com/xxxxx/xxxx/xxxx"

इसने कहा, शेल नियमों के बारे में कुछ स्पष्टीकरण यहां दिए गए हैं:

-Hदलीलों में दोहरे उद्धरण (जैसे -H "foo bar") बश को बताते हैं कि एक तर्क के रूप में क्या है (भले ही इसमें रिक्त स्थान हों)।

--dataतर्क में एकल उद्धरण (के रूप में --data 'foo bar') वही करते हैं, सिवाय इसके कि वे सभी पाठ शब्दशः (दोहरे उद्धरण वर्ण और डॉलर के संकेत सहित) पास करते हैं।

एकल उद्धृत पाठ के बीच में एक चर डालने के लिए, आपको एकल उद्धरण समाप्त करना होगा, फिर दोहरे उद्धृत चर के साथ संक्षिप्त करें, और पाठ को जारी रखने के लिए एकल उद्धरण को फिर से खोलें 'foo bar'"$variable"'more foo':।


9
"" "$ <परिवर्तनीय नाम>" "ने मेरी समस्या हल कर दी जहाँ मुझे उद्धरणों की आवश्यकता नहीं थी। धन्यवाद।
उस्मान

1
यह समाधान काम करता है लेकिन मुझे लगता है कि आप चर के आसपास के अतिरिक्त दोहरे उद्धरणों का उत्सर्जन कर सकते हैं। तो इसके बजाय: --डेटा '{"खाता": {"ईमेल": "" $ ईमेल "" "}}" आप ऐसा कर सकते हैं: --डेटा {{खाता ": {" ईमेल ":" } $ ईमेल ’’}}}
ट्विस्टेडस्ट्रीम

3
दूसरे ईओएफ के बाद एक जगह होने पर काम नहीं किया EOF :। इसे हटाने के बाद सब कुछ ठीक है।
कलस

2
@dbreaux यह निर्भर करता है कि आप कर्ल कमांड कहां चलाते हैं। यदि कमांड किसी स्क्रिप्ट में है, तो आप फ़ंक्शन को उसी स्क्रिप्ट में उसके ऊपर कहीं भी परिभाषित करते हैं। यदि आप कमांड लाइन से सीधे कर्ल चला रहे हैं, तो आपके पास कई विकल्प हैं, जिनमें से एक फ़ंक्शन को एक नई फ़ाइल में टाइप करना है और फिर कमांड लाइन source my_new_fileपर अपने वर्तमान वातावरण में फ़ंक्शन को परिभाषित करना है। उसके बाद आप संकेत के अनुसार कर्ल कमांड चला सकते हैं।
सर एथोस

2
@slashdottir यहाँ दस्तावेज़ नामक एक बश सुविधा है। आप इस लिंक पर इसके बारे में अधिक विस्तार से पढ़ सकते हैं - विशेष रूप से, उदाहरण 19-5 देखें। यहाँ पहले से ही इसके बारे में एक पूर्ण प्रश्न है
सर एथोस

103

समाधान https://httpbin.org/ और इनलाइन बैश स्क्रिप्ट के साथ परीक्षण किया गया
। 1. इसमें रिक्त स्थान के बिना चर के लिए अर्थात 1:
बस वांछित स्ट्रिंग को बदलने 'से पहले और बाद में जोड़ें$variable

for i in {1..3}; do \
  curl -X POST -H "Content-Type: application/json" -d \
    '{"number":"'$i'"}' "https://httpbin.org/post"; \
done

2. रिक्तियों के साथ इनपुट के लिए:
अतिरिक्त के साथ लपेटें चर "यानी "el a":

declare -a arr=("el a" "el b" "el c"); for i in "${arr[@]}"; do \
  curl -X POST -H "Content-Type: application/json" -d \
    '{"elem":"'"$i"'"}' "https://httpbin.org/post"; \
done

वाह काम करता है :)


1
$iरिक्त स्थान होने पर काम नहीं करता है । :(
वासिल बोरोविक

क्या आप एक उदाहरण पोस्ट कर सकते हैं?
परबंस्की

1
ज़रूर। i="a b"लूप के बजाय
वासिल बोरोविक

5
मैंने पाया कि स्वीकृत और दूसरा मत दिया गया उत्तर काम नहीं करता है /bin/sh। हालांकि, इस जवाब ने चाल चली। और यह अन्य उत्तरों की तुलना में बहुत सरल है। आपको बहुत - बहुत धन्यवाद! मैंने आपके उत्तर को कुछ अच्छे लाइन रैपिंग फॉर्मेटिंग के साथ संपादित किया है। अन्यथा, चमक को देखना मुश्किल है। चीयर्स मेट
वासिल बोरोविक

1
बहुत बहुत धन्यवाद @pbaranski आपने मेरा बहुत समय बचाया
सुधीर तातारजू

32

कर्ल एक फाइल से बाइनरी डेटा पोस्ट कर सकता है इसलिए मैं प्रक्रिया प्रतिस्थापन का उपयोग कर रहा हूं और जब भी मुझे कर्ल के साथ कुछ गंदा पोस्ट करने की आवश्यकता होती है तो फाइल डिस्क्रिप्टर का लाभ उठाता हूं और अभी भी वर्तमान शेल में वेरिएस तक पहुंच चाहता हूं। कुछ इस तरह:

curl "http://localhost:8080" \
-H "Accept: application/json" \
-H "Content-Type:application/json" \
--data @<(cat <<EOF
{
  "me": "$USER",
  "something": $(date +%s)
  }
EOF
)

यह हवा ऐसी दिखती है, --data @/dev/fd/<some number>जो सामान्य फ़ाइल की तरह संसाधित हो जाती है। वैसे भी अगर आप यह देखना चाहते हैं कि यह स्थानीय रूप से काम करे तो बस nc -l 8080पहले और ऊपर के कमांड से अलग शेल में आग लग जाए। आप कुछ इस तरह देखेंगे:

POST / HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.43.0
Accept: application/json
Content-Type:application/json
Content-Length: 43

{  "me": "username",  "something": 1465057519  }

जैसा कि आप देख सकते हैं कि आप सबहेल्ड और व्हाट्सएप और साथ ही रेफरेंस वर्जन को भी हेरेडोक में कह सकते हैं। हैप्पी हैकिंग उम्मीद है कि इस के साथ मदद करता है '"'"'""""'''""''


2
अन्य उत्तर मेरे लिए काम नहीं करते थे क्योंकि मैं इसे ज़ैबिक्स से अलर्ट में आह्वान करने की कोशिश कर रहा था। यह इसे पूरी तरह से हल करता है और अधिक साफ होता है।
0rkan

लेकिन क्या होगा यदि आप कोड को बैश फ़ंक्शन में रखते हैं: myFunction () {....}?
43:43 पर हनीनोव्स्की

1
यह ध्यान देने योग्य है कि यह नुस्खा केवल तभी काम करता है जब स्क्रिप्ट को शब्दशः कॉपी किया जाता है (अर्थात कोई ईओएफए, ब्रेसिज़ आदि सुधार नहीं करता है)
वादर बी

9

कुछ साल देर से लेकिन यह किसी की मदद कर सकता है यदि आप eval या backtick प्रतिस्थापन का उपयोग कर रहे हैं:

postDataJson="{\"guid\":\"$guid\",\"auth_token\":\"$token\"}"

प्रतिक्रिया की शुरुआत और अंत से पट्टी उद्धरण के लिए sed का उपयोग करना

$(curl --silent -H "Content-Type: application/json" https://${target_host}/runs/get-work -d ${postDataJson} | sed -e 's/^"//' -e 's/"$//')

4
  • सर एथोस से जानकारी पूरी तरह से काम किया !!

यहां बताया गया है कि मुझे couchDB के लिए अपनी कर्ल स्क्रिप्ट में इसका उपयोग कैसे करना था। यह वास्तव में बहुत मदद करता है। धन्यवाद!

bin/curl -X PUT "db_domain_name_:5984/_config/vhosts/$1.couchdb" -d '"/'"$1"'/"' --user "admin:*****"

4

यहाँ जवाब के मार्गदर्शन के बाद, मेरे लिए वास्तव में क्या काम किया गया है:

export BASH_VARIABLE="[1,2,3]"
curl http://localhost:8080/path -d "$(cat <<EOF
{
  "name": $BASH_VARIABLE,
  "something": [
    "value1",
    "value2",
    "value3"
  ]
}
EOF
)" -H 'Content-Type: application/json'

2

मौजूदा उत्तर बताते हैं कि कर्ल एक फ़ाइल से डेटा पोस्ट कर सकते हैं, और अत्यधिक बोली से बचने के लिए हेरेडोक्स को नियुक्त कर सकते हैं और स्पष्ट रूप से JSON को नई लाइनों पर तोड़ सकते हैं। हालांकि, बिल्ली से किसी फ़ंक्शन या कैप्चर आउटपुट को परिभाषित करने की आवश्यकता नहीं है, क्योंकि कर्ल मानक इनपुट से डेटा पोस्ट कर सकते हैं। मुझे यह फ़ॉर्म बहुत पठनीय लगता है:

curl -X POST -H 'Content-Type:application/json' --data '$@-' ${API_URL} << EOF
{
  "account": {
    "email": "$email",
    "screenName": "$screenName",
    "type": "$theType",
    "passwordSettings": {
      "password": "$password",
      "passwordConfirm": "$password"
    }
  },
  "firstName": "$firstName",
  "lastName": "$lastName",
  "middleName": "$middleName",
  "locale": "$locale",
  "registrationSiteId": "$registrationSiteId",
  "receiveEmail": "$receiveEmail",
  "dateOfBirth": "$dob",
  "mobileNumber": "$mobileNumber",
  "gender": "$gender",
  "fuelActivationDate": "$fuelActivationDate",
  "postalCode": "$postalCode",
  "country": "$country",
  "city": "$city",
  "state": "$state",
  "bio": "$bio",
  "jpFirstNameKana": "$jpFirstNameKana",
  "jpLastNameKana": "$jpLastNameKana",
  "height": "$height",
  "weight": "$weight",
  "distanceUnit": "MILES",
  "weightUnit": "POUNDS",
  "heightUnit": "FT/INCHES"
}
EOF
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.