ব্যাশ স্ক্রিপ্ট ফাংশনে সংজ্ঞায়িত ভেরিয়েবলগুলির সাথে কার্ল 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

তবে ব্যাশ স্ক্রিপ্ট ফাইলটিতে চালানোর সময় আমি এই ত্রুটিটি পেয়েছি

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
এই সমাধানটি কাজ করে তবে আমি মনে করি আপনি ভেরিয়েবলটি ঘিরে অতিরিক্ত ডাবল উদ্ধৃতি নির্গত করতে পারেন। সুতরাং এর পরিবর্তে: --ডাটা 'account "অ্যাকাউন্ট": {"ইমেল": "" "$ ইমেল" ""}}' আপনি এটি করতে পারেন: --ডাটা 'account "অ্যাকাউন্ট": email "ইমেল": " '$ ইমেল' "}} '
মোড়

3
যখন দ্বিতীয় ফাইলের শেষে পরে একটি স্পেস ছিল কাজ করে নি: EOF । এটি সরানোর পরে সবকিছু ঠিক আছে।
ক্লাস

2
@dbreaux এটি নির্ভর করে আপনি কার্ল কমান্ডটি কোথায় চালান। যদি কমান্ডটি কোনও স্ক্রিপ্টে থাকে, আপনি কেবল একই স্ক্রিপ্টে এটির উপরে যে কোনও জায়গায় ফাংশনটি সংজ্ঞায়িত করতে পারেন। আপনি যদি কমান্ড লাইন থেকে সরাসরি কার্ল চালাচ্ছেন, আপনার কাছে বেশ কয়েকটি বিকল্প রয়েছে যার মধ্যে একটি হ'ল ফাংশনটি একটি নতুন ফাইলে টাইপ করা এবং তারপরে source my_new_fileআপনার বর্তমান পরিবেশে ফাংশনটি সংজ্ঞায়িত করতে কমান্ড লাইনে রান করুন । এর পরে আপনি কার্ল কমান্ডটি নির্দেশিত হিসাবে চালাতে পারেন।
স্যার অ্যাটোস

2
@ স্ল্যাশডোটার এটি হর ডকুমেন্টস নামে পরিচিত একটি বাশ বৈশিষ্ট্য। আপনি এই লিঙ্কটিতে আরও বিস্তারিতভাবে এটি পড়তে পারেন - বিশেষত, উদাহরণ 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ফাঁকা স্থান থাকে তার জন্য কাজ করে না । :(
ভ্যাসিল বোরোভিয়াক

আপনি একটি উদাহরণ পোস্ট করতে পারেন?
pbaranski

1
অবশ্যই। i="a b"লুপের পরিবর্তে
ভ্যাসিল বোরোভিয়াক

5
আমি দেখেছি যে গৃহীত এবং দ্বিতীয় ভোট দেওয়া উত্তরটি কাজ করে না /bin/sh। যাইহোক, এই উত্তরটি কৌশলটি করেছিল। এবং অন্যান্য উত্তরগুলির তুলনায় এটি অনেক সহজ। তোমাকে অনেক ধন্যবাদ! আমি আপনার উত্তরটি কিছু ভাল লাইন মোড়কের ফর্ম্যাটিংয়ের সাথে সম্পাদনা করেছি। অন্যথায়, উজ্জ্বলতা খুঁজে পাওয়া শক্ত। চিয়ার্স সাথী
ভ্যাসিল বোরোভিয়াক

1
অনেক ধন্যবাদ @ পবারানসকি আপনি আমার অনেক সময়
সাশ্রয় করেছেন

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 () {....}?
হ্যান্নোস্কি

1
এটি লক্ষণীয় যে এই রেসিপিটি কেবল তখনই স্ক্রিপ্টটি অনুলিপি করা হয় (যেমন কোনও পুনরায় ফর্ম্যাটিং ইওএফ, ধনুর্বন্ধনী ইত্যাদি)
ভাদর বি

9

কয়েক বছর দেরি হলেও আপনি কাউকে সাহায্য করতে পারেন যদি আপনি ইওল বা ব্যাকটিক বিকল্প ব্যবহার করছেন:

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

প্রতিক্রিয়া শুরু এবং শেষ থেকে উদ্ধৃতি স্ট্রিপ ব্যবহার

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

4
  • স্যার অ্যাথোসের তথ্য পুরোপুরি কাজ করেছিল !!

কাউচডিবি-র জন্য আমাকে আমার কার্ল স্ক্রিপ্টে এটি কীভাবে ব্যবহার করতে হয়েছিল তা এখানে। এটি সত্যিই অনেক সাহায্য করেছে। ধন্যবাদ!

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

বিদ্যমান উত্তরগুলি নির্দেশ করে যে কার্ল কোনও ফাইল থেকে ডেটা পোস্ট করতে পারে এবং অতিরিক্ত উদ্ধৃতি এড়াতে এড়াতে এবং জেএসএনকে নতুন লাইনে স্পষ্টভাবে বিচ্ছিন্ন করতে হেরডোকগুলিকে নিয়োগ করতে পারে। তবে বিড়াল থেকে কোনও ক্রিয়া বা আউটপুট ক্যাপচারের সংজ্ঞা দেওয়ার দরকার নেই কারণ কার্ল স্ট্যান্ডার্ড ইনপুট থেকে ডেটা পোস্ট করতে পারে। আমি এই ফর্মটি খুব পঠনযোগ্য বলে মনে করি:

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.