JSON को PHP के साथ कर्ल के साथ कैसे पोस्ट करें


108

मैं बेस ऑफ हो सकता हूं, लेकिन मैं इस दोपहर के बाद PHP फ्रेमवर्क ट्यूटोरियल में कर्ल पोस्ट कमांड को चलाने के लिए पूरी कोशिश कर रहा हूं । जो मुझे समझ नहीं आ रहा है कि PHP को मेरे POST की व्याख्या कैसे करनी चाहिए, यह हमेशा एक खाली सरणी के रूप में आता है।

curl -i -X POST -d '{"screencast":{"subject":"tools"}}'  \
      http://localhost:3570/index.php/trainingServer/screencast.json

(वहाँ स्लैश सिर्फ मुझे एक बेवकूफ की तरह नहीं बनाने के लिए है, लेकिन मैंने इसे PHP 5.2 का उपयोग करके खिड़कियों से निष्पादित किया है, एक लिनक्स सर्वर पर भी कोशिश की है, लिनक्स कर्ल के साथ एक ही संस्करण)

ऐसा कुछ होना चाहिए जो मुझे याद आ रहा है क्योंकि यह बहुत सीधा लगता है, पोस्ट को सिर्फ सही नहीं बताया गया है, अगर यह होता तो सब कुछ बहुत अच्छा होता।

यह वही है जो मुझे वापस मिलता है:

HTTP / 1.1 409 संघर्ष
दिनांक: शुक्र, 01 मई 2009 22:03:00 GMT
सर्वर: Apache / 2.2.8 (Win32) PHP / 5.2.6
X-Powered-by: PHP / 5.2.6
स्थानांतरण-एन्कोडिंग: chunked
सामग्री-प्रकार: पाठ / html; charset = iso-8859-1

{ "स्क्रीनकास्ट": { "id": अशक्त, "विषय": अशक्त, "शरीर": अशक्त,
         "DataUrl": अशक्त, "dataMedium": अशक्त, "createdOn": अशक्त, "लेखक": अशक्त}}

क्या आप अपनी .php फ़ाइल को कॉपी-पेस्ट कर सकते हैं? क्या आप सुनिश्चित हैं कि URL लोकलहोस्ट: 3570 / index.php / trainingServer / screencast.json आपकी स्क्रिप्ट चलाता है? यह PHP URL की तरह नहीं दिखता है।
पीटी

@pts; पीटर किसी प्रकार के MVC फ्रेमवर्क का उपयोग कर रहा है, उस URL में index.php पर एक नज़र डालें।
एलन स्टॉर्म

@ मैं PHP के लिए डेल्फी (इसलिए: 3570) और Recess MVC फ्रेमवर्क w / out .htaccess फ़ाइल का उपयोग कर रहा हूं, इसलिए url में index.php /।
पीटर टर्नर

7
इसे भेजने के लिए मत भूलना application/json
गुमबो

1
सरल शब्दों में उन्हें एम्बेड करते समय दोहरे उद्धरण चिह्नों से बचना आवश्यक नहीं है।

जवाबों:


107

$ _POST- सरणी आबादी क्यों नहीं है के जॉर्डन विश्लेषण सही है। हालाँकि, आप उपयोग कर सकते हैं

$data = file_get_contents("php://input");

बस http बॉडी को पुनः प्राप्त करने और अपने आप को संभालने के लिए। PHP इनपुट / आउटपुट स्ट्रीम देखें ।

प्रोटोकॉल के नजरिए से यह वास्तव में अधिक सही है, क्योंकि आप वास्तव में http मल्टीपार्ट फॉर्म डेटा का प्रसंस्करण नहीं कर रहे हैं। अपने अनुरोध को पोस्ट करते समय सामग्री / प्रकार के रूप में एप्लिकेशन / json का उपयोग करें।


7
Json_decode (file_get_contents ("php: // input"), सच करना) ने काम किया। साभार
पीटर टर्नर

वास्तव में मेरी स्थिति में भी मदद की! धन्यवाद एमिल एच!
स्टीव

बहुत खुबस। मुझे यह जानकर बहुत परेशानी हो रही थी कि यह पद छीन रहा है .. एक साधारण सा अर्क जिसने मेरे लिए काम किया। इसके अलावा पीटर टर्नर इसके अलावा json_decode () एक \ stdClass ऑब्जेक्ट प्रदान करते हैं। मैंने इसे Garmin API पिंग प्रतिक्रियाओं के लिए उपयोग किया
JI-Web

120

आम तौर पर पैरामीटर -dको फॉर्म-एन्कोडेड के रूप में व्याख्या की जाती है। आपको -Hपैरामीटर की आवश्यकता है :

curl -v -H "Content-Type: application/json" -X POST -d '{"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json

18

मेरा मानना ​​है कि आपको खाली सरणी मिल रही है क्योंकि PHP पोस्ट किए गए डेटा को क्वेरिस्ट्रिंग प्रारूप (कुंजी = मान और की 1 = मान 1) में होने की उम्मीद कर रहा है।

अपना कर्ल अनुरोध बदलने की कोशिश करें:

curl -i -X POST -d 'json={"screencast":{"subject":"tools"}}'  \
      http://localhost:3570/index.php/trainingServer/screencast.json

और देखें कि क्या इससे कोई मदद मिलती है।


हां, -H "Content-Type: application/json"मेरे लिए काम नहीं किया।
पीजे ब्रुनेट

13

आपको कुछ अतिरिक्त झंडे सेट करने की आवश्यकता है ताकि कर्ल को JSON के रूप में डेटा भेजा जाए।

आदेश

$ curl -H "Content-Type: application/json" \
       -X POST \
       -d '{"JSON": "HERE"}' \
       http://localhost:3000/api/url

झंडे

  • -H: कस्टम हेडर, अगले तर्क हेडर होने की उम्मीद है
  • -X: कस्टम HTTP क्रिया, अगले तर्क क्रिया होने की उम्मीद है
  • -d: HTTP POST अनुरोध में डेटा के रूप में अगला तर्क भेजता है

साधन


1

आपको इस तरह उद्धरणों से बचना चाहिए:

curl -i -X POST -d '{\"screencast\":{\"subject\":\"tools\"}}'  \
  http://localhost:3570/index.php/trainingServer/screencast.json

विंडोज पर यह वास्तव में मेरे लिए काम करता है, लेकिन पूरे उद्धरण स्ट्रिंग को संलग्न करने के लिए दोहरे उद्धरण चिह्नों का उपयोग करता है।
मीटवेस्ट

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