मैं CURL के साथ JSON डेटा कैसे बनाऊं?


2827

मैं Ubuntu का उपयोग करता हूं और उस पर cURL स्थापित करता हूं । मैं cURL के साथ अपने स्प्रिंग रीस्ट एप्लिकेशन का परीक्षण करना चाहता हूं। मैंने जावा पोस्ट पर अपना POST कोड लिखा है। हालांकि, मैं इसे cURL के साथ टेस्ट करना चाहता हूं। मैं एक JSON डेटा पोस्ट करने का प्रयास कर रहा हूं। उदाहरण डेटा इस प्रकार है:

{"value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true}

मैं इस कमांड का उपयोग करता हूं:

curl -i \
    -H "Accept: application/json" \
    -H "X-HTTP-Method-Override: PUT" \
    -X POST -d "value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true \
    http://localhost:8080/xx/xxx/xxxx

यह त्रुटि लौटाता है:

HTTP/1.1 415 Unsupported Media Type
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 1051
Date: Wed, 24 Aug 2011 08:50:17 GMT

त्रुटि विवरण यह है:

सर्वर ने इस अनुरोध को अस्वीकार कर दिया क्योंकि अनुरोध इकाई अनुरोधित विधि () के लिए अनुरोधित संसाधन द्वारा समर्थित प्रारूप में नहीं है।

टॉमकैट लॉग: "POST / ui / webapp / conf / clear HTTP / 1.1" 415 1051

CURL कमांड का सही प्रारूप क्या है?

यह मेरा जावा साइड PUTकोड है (मैंने GET और DELETE का परीक्षण किया है और वे काम करते हैं):

@RequestMapping(method = RequestMethod.PUT)
public Configuration updateConfiguration(HttpServletResponse response, @RequestBody Configuration configuration) { //consider @Valid tag
    configuration.setName("PUT worked");
    //todo If error occurs response.sendError(HttpServletResponse.SC_NOT_FOUND);
    return configuration;
}

6
वसंत 3.2.0 पोस्ट अनुरोधों के लिए लिंक चेकआउट करें ।
अमीरहद

8
Restful Microservices के Ad Hoc परीक्षण के लिए कर्ल का उपयोग करते हुए एक अच्छी पोस्ट है जो इसे कई उदाहरणों के साथ कवर करती है।
upitau

जवाबों:


4337

आपको एप्लिकेशन / json के लिए अपनी सामग्री-प्रकार सेट करने की आवश्यकता है। लेकिन -dसामग्री-प्रकार भेजता है application/x-www-form-urlencoded, जिसे स्प्रिंग की ओर से स्वीकार नहीं किया जाता है।

कर्ल मैन पेज को देखते हुए , मुझे लगता है कि आप इसका उपयोग कर सकते हैं -H:

-H "Content-Type: application/json"

पूर्ण उदाहरण:

curl --header "Content-Type: application/json" \
  --request POST \
  --data '{"username":"xyz","password":"xyz"}' \
  http://localhost:3000/api/login

( -Hके लिए कम है --header, -dके लिए --data)

ध्यान दें कि -request POSTहै वैकल्पिक अगर आप का उपयोग करें -d, के रूप में -dझंडा एक पोस्ट अनुरोध निकलता है।


विंडोज पर, चीजें थोड़ी अलग हैं। टिप्पणी धागा देखें।


262
खिड़कियों के लिए, json के आसपास के एकल उद्धरण काम नहीं करते थे और मैंने दोहरे उद्धरणों से बचकर समाप्त किया। curl -X POST -H "Content-Type: application/json" -d "{ \"key1\": \"value1\" }" http://localhost:3000/api/method
hIpPy

37
मेरे लिए विंडोज के तहत मुझे इस प्रारूप में उद्धरणों का उपयोग करके उद्धरणों से बचने की आवश्यकता थी "{ """key1""": """value1""" }"। इसके अलावा यह जवाब: stackoverflow.com/questions/18314796/…
chodorowicz

4
@chodorowicz जो भयानक है! मुझे केवल VB से वाक्य रचना ही पता है!
सीन पैट्रिक फ्लोयड

3
मेरे पास POST अनुरोधों के साथ समस्याएँ हैं, लेकिन इसे "एप्लिकेशन / json" द्वारा कैपिटल में हल किया गया है, इसलिए यदि आपको 415 त्रुटि मिलती है, तो कैपिटलाइज़ेशन की जाँच करें।
वाइटकैस्टल

5
@ostrokach खेद है कि इसने आपका समय बर्बाद किया। सिंटैक्स ने OSX पर मेरे लिए ठीक काम किया जब मैंने इसे पोस्ट किया (वापस नहीं लिया)। लगता है कि यह सिर्फ एक मंच अंतर था। मुझे लगता है कि अपवित्र लोगों से है कि यह मदद की है।
एडम टटल ने

564

अपना डेटा किसी फ़ाइल में रखने का प्रयास करें, कहें body.jsonऔर फिर उपयोग करें

curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf

12
आपको शायद --data-binaryइसके बजाय विकल्प का उपयोग करना चाहिए --data। एक उम्मीद करता है कि क्लाइंट डेटा को जैसे-तैसे भेजता है, लेकिन --dataइनपुट से CR und LF को स्ट्रिप्स करता है।
h2stein

14
इनलाइन json स्ट्रिंग्स के साथ cUrl का उपयोग करना एक बुरा सपना लगता है। दोहरे कोटे के चरित्र का बलात्कार करने की आवश्यकता है। इस तरह एक फ़ाइल के साथ जा रहे हैं अच्छे।
Xtreme बाइकर

46
@फ़ाइल के नाम से पहले एक चरित्र जोड़ना महत्वपूर्ण है , अन्यथा यह काम नहीं करेगा। मैंने इस बकवास पर अपना सिर पीटते हुए 20 मिनट बिताए ...
रादु मुराज़े

3
इस तरह आप JSON को पार्स करने में कोई त्रुटि है या नहीं यह देखने के लिए फ़ाइल पर एक JSON लिंट भी चला सकते हैं।
डेट्समैन

4
विंडोज़ पर, आपको फ़ाइल नाम "@ body.json" के आसपास दोहरे उद्धरण चिह्नों की आवश्यकता है
Stomf

101

आप आराम कर सकते हैं उपयोगी: https://github.com/micha/resty

यह एक आवरण गोल CURL है जो कमांड लाइन REST अनुरोधों को सरल करता है। आप इसे अपने API समापन बिंदु पर इंगित करते हैं, और यह आपको PUT और POST कमांड देता है। (मुखपृष्ठ से अनुकूलित उदाहरण)

$ resty http://127.0.0.1:8080/data #Sets up resty to point at your endpoing
$ GET /blogs.json                  #Gets http://127.0.0.1:8080/data/blogs.json
                                   #Put JSON
$ PUT /blogs/2.json '{"id" : 2, "title" : "updated post", "body" : "This is the new."}'
                                   # POST JSON from a file
$ POST /blogs/5.json < /tmp/blog.json

साथ ही, कंटेंट टाइप हेडर जोड़ने के लिए अक्सर यह आवश्यक है। आप इसे एक बार कर सकते हैं, हालाँकि, प्रति-विधि प्रति विन्यास फाइल जोड़ने के लिए एक डिफ़ॉल्ट सेट करने के लिए: डिफ़ॉल्ट RESTY विकल्प सेट करना


93

विंडोज के लिए, -dमूल्य के लिए एक भी उद्धरण मेरे लिए काम नहीं करता था, लेकिन यह दोहरे उद्धरण में बदलने के बाद काम करता था। इसके अलावा मुझे घुंघराले कोष्ठक के अंदर दोहरे उद्धरण चिह्नों से बचने की आवश्यकता थी।

अर्थात्, निम्नलिखित काम नहीं किया:

curl -i -X POST -H "Content-Type: application/json" -d '{"key":"val"}' http://localhost:8080/appname/path

लेकिन निम्नलिखित ने काम किया:

curl -i -X POST -H "Content-Type: application/json" -d "{\"key\":\"val\"}" http://localhost:8080/appname/path

5
FYI करें - ऐसा लगता है कि आपको json body के आस-पास एक बंद दोहरा भाव याद आ रहा है
acanby

3
विंडोज पर मेरे लिए, "डेटा के आसपास काम नहीं करता है, इसके बजाय कोई उद्धरण काम नहीं करता है
rodedo

3
यदि आप PowerShell का उपयोग कर रहे हैं, तो यह उत्तर देखें ।
19

86

इसने मेरे लिए काम किया:

curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":100}' http://localhost/api/postJsonReader.do

यह खुशी से स्प्रिंग नियंत्रक के लिए मैप किया गया था:

@RequestMapping(value = "/postJsonReader", method = RequestMethod.POST)
public @ResponseBody String processPostJsonData(@RequestBody IdOnly idOnly) throws Exception {
        logger.debug("JsonReaderController hit! Reading JSON data!"+idOnly.getId());
        return "JSON Received";
}

IdOnlyएक आईडी संपत्ति के साथ एक साधारण POJO है।


56

एक उदाहरण के रूप में, JSON फ़ाइल बनाएं, params.json, और इस सामग्री को इसमें जोड़ें:

[
    {
        "environment": "Devel",
        "description": "Machine for test, please do not delete!"
    }
]

तब आप यह आदेश चलाते हैं:

curl -v -H "Content-Type: application/json" -X POST --data @params.json -u your_username:your_password http://localhost:8000/env/add_server

42

मैं बस एक ही समस्या में भाग जाता हूं। मैं इसे निर्दिष्ट करके हल कर सकता था

-H "Content-Type: application/json; charset=UTF-8"

37

इसने मेरे लिए अच्छा काम किया।

curl -X POST --data @json_out.txt http://localhost:8080/

कहाँ पे,

-X Http क्रिया का अर्थ है।

--data मतलब वह डेटा जिसे आप भेजना चाहते हैं।


5
-X POSTइस उदाहरण में अनावश्यक है
सॉफ्टवेयर इंजीनियर

31

आप अपने आदेश को इकट्ठा करने के लिए अपने सहज जीयूआई के साथ पोस्टमैन का उपयोग कर सकते हैं cURL

  1. पोस्टमैन स्थापित करें और शुरू करें
  2. अपने URL में टाइप करें, पोस्ट बॉडी, अनुरोध हेडर आदि पीपी।
  3. पर क्लिक करें Code
  4. cURLड्रॉप-डाउन सूची से चयन करें
  5. अपने cURLआदेश को कॉपी और पेस्ट करें

नोट: ड्रॉप-डाउन सूची में स्वचालित अनुरोध पीढ़ी के लिए कई विकल्प हैं, यही वजह है कि मुझे लगा कि मेरी पोस्ट पहली जगह में neccessary थी।


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

29

CURL Windows का उपयोग करके, यह आज़माएँ:

curl -X POST -H "Content-Type:application/json" -d "{\"firstName\": \"blablabla\",\"lastName\": \"dummy\",\"id\": \"123456\"}" http-host/_ah/api/employeeendpoint/v1/employee

28

CURL में कनवर्ट करने के लिए आप पोस्टमैन का उपयोग कर सकते हैंयहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें


1
बहुत बहुत धन्यवाद @ हमेशा-ला यह मेरे लिए एक जीवन रक्षक टिप था
vibs2006

24

HTTPie एक अनुशंसित विकल्प है curlक्योंकि आप बस कर सकते हैं

$ http POST http://example.com/some/endpoint name=value name1=value1

यह JSON को डिफ़ॉल्ट रूप से बोलता है और आपके लिए आवश्यक हेडर को सेट करने के साथ ही मान्य JSON के डेटा को एन्कोडिंग करने के लिए दोनों को हैंडल करेगा। वहाँ भी:

Some-Header:value

हेडर के लिए, और

name==value

क्वेरी स्ट्रिंग पैरामीटर के लिए। यदि आपके पास डेटा का एक बड़ा हिस्सा है, तो आप इसे एक फ़ाइल से भी पढ़ सकते हैं, यह JSON एनकोडेड होना चाहिए:

 field=@file.txt

20

यदि आप JSON सेंड / रिस्पॉन्सफुल इंटरफेस के खिलाफ बहुत सारी जांच कर रहे हैं, तो आप क्रोम के लिए पोस्टमैन प्लग-इन चेक कर सकते हैं (जो आपको वेब सेवा परीक्षणों को मैन्युअल रूप से परिभाषित करने की अनुमति देता है) और इसका Node.js-आधारित न्यूमैन कमांड -लाइन साथी (जो आपको पोस्टमैन परीक्षणों के "संग्रह" के खिलाफ परीक्षणों को स्वचालित करने की अनुमति देता है।) दोनों मुक्त और खुले!


18

यह मेरे लिए अच्छी तरह से काम किया, इसके अलावा बुनियादी प्रमाणीकरण का उपयोग:

curl -v --proxy '' --basic -u Administrator:password -X POST -H "Content-Type: application/json"
        --data-binary '{"value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true}'
        http://httpbin.org/post

बेशक, आपको एसएसएल और चेक किए गए प्रमाण पत्र के बिना बुनियादी प्रमाणीकरण का उपयोग कभी नहीं करना चाहिए।

मैं आज फिर से इस में भाग गया, विंडोज के लिए Cygwin के 7.49.1 का उपयोग --dataकर ... और --data-binaryJSON तर्क के साथ या उपयोग करते समय, CURL भ्रमित हो गया और {}JSON में URL टेम्पलेट के रूप में व्याख्या करेगा । -gCURL ग्लोबिंग को बंद करने के लिए एक तर्क जोड़ना तय किया गया है।

कोष्ठक के साथ URL को कर्ल करने के लिए भी देखें ।


17

आप अपनी JSON सामग्री को एक फ़ाइल में भी रख सकते हैं और इसे --file-uploadमानक इनपुट के माध्यम से विकल्प का उपयोग करके कर्ल पास कर सकते हैं , जैसे:

 echo 'my.awesome.json.function({"do" : "whatever"})' | curl -X POST "http://url" -T -


10

मैं वेब सर्वर के साथ परीक्षण करने के लिए नीचे प्रारूप का उपयोग कर रहा हूं।

use -F 'json data'

चलिए मान लेते हैं कि यह JSON तानाशाही प्रारूप है:

{
    'comment': {
        'who':'some_one',
        'desc' : 'get it'
    }
}

पूर्ण उदाहरण

curl -XPOST your_address/api -F comment='{"who":"some_one", "desc":"get it"}'

6

पेलोड जोड़ने के लिए -d विकल्प का उपयोग करें

curl -X POST \
http://<host>:<port>/<path> \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"foo": "bar",
"lorem": "ipsum"
}'

के अतिरिक्त:

POST विधि का उपयोग करने के लिए -X POST का उपयोग करें

उपयोग -H 'स्वीकार करें: आवेदन / json' स्वीकार प्रकार हेडर जोड़ने के लिए

उपयोग -H 'सामग्री-प्रकार: अनुप्रयोग / json' सामग्री प्रकार हेडर जोड़ने के लिए


मैंने इसका उपयोग करने की कोशिश की लेकिन {"त्रुटियां": ["कोई डेटा प्रदान नहीं किया गया"]} त्रुटि।
सुरेश


5

कृपया इस टूल को देखें । यह आपको आसानी से कर्ल स्निपेट्स बनाने में मदद करता है।

curl -XGET -H "Accept: application/json" -d "{\"value\":\"30\",\"type\":\"Tip 3\",\"targetModule\":\"Target 3\",\"configurationGroup\":null,\"name\":\"Configuration Deneme 3\",\"description\":null,\"identity\":\"Configuration Deneme 3\",\"version\":0,\"systemId\":3,\"active\":true}" "http://localhost:8080/xx/xxx/xxxx"

5

यह करने का एक और तरीका है, यदि आपके पास गतिशील डेटा शामिल है।

#!/bin/bash

version=$1
text=$2
branch=$(git rev-parse --abbrev-ref HEAD)
repo_full_name=$(git config --get remote.origin.url | sed 's/.*:\/\/github.com\///;s/.git$//')
token=$(git config --global github.token)

generate_post_data()
{
  cat <<EOF
{
  "tag_name": "$version",
  "target_commitish": "$branch",
  "name": "$version",
  "body": "$text",
  "draft": false,
  "prerelease": false
}
EOF
}

echo "Create release $version for repo: $repo_full_name branch: $branch"
curl --data "$(generate_post_data)" "https://api.github.com/repos/$repo_full_name/releases?access_token=$token"

1
तुमने मेरी जान बचाई!
अभिमन्यु

4

मुझे पता है, इस सवाल का बहुत जवाब दिया गया है, लेकिन मैं इस मुद्दे को साझा करना चाहता था:

कर्ल -X POST http: // your-server-end-point -H "कंटेंट-टाइप: एप्लीकेशन / जसन" -d "पाथ-ऑफ-योर-जोंस-फाइल। जसन

देखें, मैंने सब कुछ ठीक किया, केवल एक ही चीज़ - "@" मैं JSON फ़ाइल पथ से पहले याद किया।

मुझे इंटरनेट पर एक प्रासंगिक गो-टू दस्तावेज़ मिला - https://gist.github.com/subfuzion/08c5d85437d5d4f00e58

उम्मीद है कि कुछ मदद मिल सकती है। धन्यवाद


1

यदि आप SWAGGER को अपने स्प्रिंग बूट एप्लिकेशन में कॉन्फ़िगर करते हैं, और अपने एप्लिकेशन से किसी भी API को वहां लाते हैं, तो आप उस CURL अनुरोध को भी देख सकते हैं।

मुझे लगता है कि यह CURL के माध्यम से अनुरोधों को उत्पन्न करने का आसान तरीका है।


-6

आप उस प्रारूप के विस्तार को पारित कर सकते हैं जिसे आप url के अंत के रूप में चाहते हैं। जैसे http: // localhost: 8080 / xx / xxx / xxxx .json

या

http: // localhost: 8080 / xx / xxx / xxxx .xml

नोट: आपको अपने पोम में जैक्सन और जैक्सब मावेन निर्भरता जोड़ने की आवश्यकता है।


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