2010-11-24 24 views
10

मुझे निम्नलिखित JSON कोड पोस्ट करने की आवश्यकता है, लेकिन किसी कारण से यह काम नहीं कर रहा है। नीचे मेरे पास कोड है।PHP कर्ल, पोस्ट JSON

$fieldString = "395609399"; 
//the curl request processor 
function processCurlJsonrequest($URL, $fieldString) { //Initiate cURL request and send back the result 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_HTTPHEADERS, array('Content-Type: application/json')); 
    curl_setopt($ch, CURLOPT_URL, $URL); 
    curl_setopt($ch, CURLOPT_USERAGENT, $this->_agent); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $this->_cookie_file_path); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $this->_cookie_file_path); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); 
    curl_setopt($ch, CURLOPT_VERBOSE, TRUE); 
    if ($fieldCount) { // in case of post fields present then pass it on 
     curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode("{categoryId: $fieldString}")); 
     curl_setopt($ch, CURLOPT_POST, 1); 
    } 
    $resulta = curl_exec($ch); 
    if (curl_errno($ch)) { 
     print curl_error($ch); 
    } else { 
     curl_close($ch); 
    } 
    return $resulta; 
} 

यहाँ समारोह जो cURL अनुरोध कहता है:

function get_cat($categoryId, $URL) { 
    $fields = array(
     "categoryId" => $categoryId 
    ); 
    $fields_string = $fields; 
    return $this->processCurlJsonrequest($URL, $fields_string); 
} 
+0

json_encode एक PHP सरणी दें, एक स्ट्रिंग नहीं जो पहले से ही जेएस ऑब्जेक्ट के रूप में है। – JAL

+0

मैंने curl_setopt ($ ch, CURLOPT_POSTFIELDS, सरणी (json_encode (सरणी ( "श्रेणी आईडी" => "5016"))) की कोशिश की है; और json_encode (सरणी ( "श्रेणी आईडी" => "5016")); और – Michael

+3

काम नहीं कर रहा है यह बहुत ही परेशान है कि आपने स्पष्ट रूप से समस्या हल की है (जैसा कि आपकी टिप्पणी द्वारा इंगित किया गया है) लेकिन यह इंगित करने के लिए पोस्ट को अपडेट नहीं किया गया कि समाधान क्या था। कुछ कारणों से – shanusmagnus

उत्तर

16

सा है कि समस्या है:

curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode("{categoryId: $fieldString}")); 

CURLOPT_POSTFIELDS मानकों की एक सरणी स्वीकार करेंगे या तो, या एक पैरामीटर की यूआरएल-एन्कोडेड स्ट्रिंग:

curl_setopt($ch, CURLOPT_POSTFIELDS, array('json'=>json_encode($stuff))); 
curl_setopt($ch, CURLOPT_POSTFIELDS, 'json='.urlencode(json_encode($stuff))); 

जहां json डाक क्षेत्र का नाम होगा (यानी: परिणामस्वरूप $_POST['json'] पहुंच योग्य होगा)।

+0

काम नहीं कर रहा है। मुझे {"संदेश" मिल रहा है: "अनुरोध को संसाधित करने में त्रुटि हुई।", "स्टैकट्रेस": "", "अपवाद टाइप": ""} ऐरे ([संदेश] => अनुरोध को संसाधित करने में त्रुटि हुई। [ StackTrace] => [ExceptionType] =>)। मुझे लगता है क्योंकि पोस्ट ठीक से नहीं बनाया गया है। – Michael

+0

मैंने इस लिंक पर एक तस्वीर अपलोड की है ताकि आप http विश्लेषक से बिल्कुल सही अनुरोध देख सकें कि मैं php curl के साथ दोहराने की कोशिश कर रहा हूं। http://img502.imageshack.us/img502/1346/analyzer.jpg – Michael

+1

जैसा कि आप http विश्लेषक में देख सकते हैं, कोई पोस्ट फ़ील्ड नहीं दिखता है (उदाहरण के लिए "जेसन") – Michael

8

JSON एन्कोडिंग के बिना अपने पाठ भेजें, और इस हेडर कोड जोड़ें:

curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json; charset=utf-8","Accept:application/json, text/javascript, */*; q=0.01")); 
3

मैं था cURL के माध्यम से JSON भेजने के मुद्दों, और समस्या यह थी कि मैं स्पष्ट रूप से शीर्ष लेख में सामग्री की लंबाई की स्थापना नहीं की गई थी।

तो हैडर होना चाहिए:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: ' . strlen($json))); 
6
प्रारंभिक उदाहरण के साथ

, कोड काम इस तरह किया जाना चाहिए:

//the curl request processor 
function processCurlJsonrequest($URL, $fieldString) { //Initiate cURL request and send back the result 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); 
    curl_setopt($ch, CURLOPT_URL, $URL); 
    curl_setopt($ch, CURLOPT_USERAGENT, $this->_agent); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $this->_cookie_file_path); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $this->_cookie_file_path); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); 
    curl_setopt($ch, CURLOPT_VERBOSE, TRUE); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(array("myJsonData" => "test"))); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    $resulta = curl_exec($ch); 
    if (curl_errno($ch)) { 
     print curl_error($ch); 
    } else { 
     curl_close($ch); 
    } 
    return $resulta; 
} 
2

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

संबंधित मुद्दे