2012-09-24 7 views
6

मैं अपनी समस्या के समाधान के लिए सभी स्टैक ओवरफ्लो और Google को खोज रहा हूं।Zend_HTTP_Client मुझे किसी भी डेटा को पोस्ट करने दें

मैंने ज़ेंड फ्रेमवर्क - Project1 और Project2 के साथ दो परियोजनाएं बनाई हैं - और मैं उनमें से एक पर वेब सेवाएं लागू करना चाहता हूं। विचार है कि JSON-string को Project1 पर भेजना और POST का उपयोग करके उस चर के साथ जुड़े सभी विवरणों के साथ JSON वापस प्राप्त करना है। अब मैं Project2 पर एक TestController बनाया है:

public function indexAction(){ 

    $uri = 'http://project1.com/WebService/data'; 

    $config = array(
     'adapter' => 'Zend_Http_Client_Adapter_Curl', 
     'curloptions' => array(CURLOPT_FOLLOWLOCATION => true), 
    ); 
    $client = new Zend_Http_Client($uri, $config); 

    $request = $client->request('POST'); 

    print_r($request->getBody()); 

    exit(); 

} 

ऊपर कोड काम करता है। यह Project1 नियंत्रक से पढ़ता है और मुझे जो कुछ भी गूंजता है उसका आउटपुट देता है। लेकिन जब मैं कोशिश यह:

public function indexAction(){ 

    $uri = 'http://project1.com/WebService/data'; 

    $config = array(
     'adapter' => 'Zend_Http_Client_Adapter_Curl', 
     'curloptions' => array(CURLOPT_FOLLOWLOCATION => true), 
    ); 
    $client = new Zend_Http_Client($uri, $config); 

    $data = array(
      'userID'  => 'TEST TEST', 
      'value'  => 1, 
      'description' => 'ABCDEFG', 
    ); 

    $request = $client->request('POST'); 

      $json = json_encode($data); 

      $client->setRawData($json, 'application/json')->request('POST'); 

    exit(); 

} 

और सर्वर साइड जब मैं dataAction अंदर प्रदर्शित की कोशिश पर:

public function dataAction(){ 

    var_dump($this->getRequest()->getParam('var-name')); 

    var_dump($_POST); 

    die();  

} 

मैं इस का उत्पादन मिलता है: शून्य सरणी (0) {} .... जब मैं क्लाइंट पक्ष पर कोशिश करता हूं तो मुझे वही आउटपुट मिलता है। इसके अलावा उल्लेख करने के लिए .. मैंने php: // इनपुट फ़ाइल खोलने का भी प्रयास किया लेकिन एक खाली स्ट्रिंग मिली ...

मुझे क्या याद आ रही है ??? मैंने खुद को सुबह से खोजना निराश किया है लेकिन मुझे कोई समाधान नहीं मिला है।

प्रतिक्रिया के लिए अग्रिम धन्यवाद।

उत्तर

5

यहाँ आप क्या याद कर रहे हैं है:

$json = json_encode($data); 
$client->setRawData($json, 'application/json')->request('POST'); 

एक पोस्ट अनुरोध भेजता है लेकिन पोस्ट शरीर में डेटा एक url- एन्कोडेड स्ट्रिंग, बजाय यह सिर्फ कच्चे JSON है नहीं है।

कॉलिंग $this->getRequest()->getParam('foo') PHP superglobals $_GET और $_POST पर देखता है जिसमें कोई भी JSON पैरामीटर नहीं होगा। इसका कारण खाली होगा क्योंकि PHP POST डेटा को पार्स नहीं कर सका क्योंकि यह JSON था और HTTP url-encoded सामग्री नहीं।

यदि आप POST बॉडी में JSON डेटा प्राप्त करना चाहते हैं तो समाधान dataAction में ऐसा कुछ उपयोग करना है।

$post = $this->getRequest()->getRawBody(); 

try { 
    $json = Zend_Json::decode($post); 

    // now access parameters from $json array 
} catch (Zend_Json_Exception $ex) { 
    echo "Failed to decode request, POST did not contain valid JSON."; 
} 

संपादित करें: यहां पूरा कोड है जिसके साथ आप गड़बड़ कर सकते हैं।

public function requestAction() 
{ 
    // CHANGE THIS 
    $uri = 'http://playground/zendapp/public/index/data'; 

    $config = array(
      'adapter' => 'Zend_Http_Client_Adapter_Curl', 
      'curloptions' => array(CURLOPT_FOLLOWLOCATION => true), 
    ); 
    $client = new Zend_Http_Client($uri, $config); 

    $data = array(
      'userID'  => 'TEST TEST', 
      'value'  => 1, 
      'description' => 'ABCDEFG', 
    ); 

    $json = json_encode($data); 

    $resp = $client->setRawData($json, 'application/json')->request('POST'); 

    var_dump($resp->getBody()); 

    exit(); 

} 

public function dataAction() 
{ 
    $post = $this->getRequest()->getRawBody(); 

    try { 
     $json = Zend_Json::decode($post); 

     print_r($json); 
    } catch (Exception $ex) { 
     echo "failed to decode json"; 
    } 

    exit; 
} 
+0

त्वरित प्रतिक्रिया प्राप्त करने में खुशी हुई। जैसा कि आपने कहा था कि मैंने उस कोड का उपयोग करने की कोशिश की लेकिन मुझे var_dump ($ json) और bool (false) के साथ var_dump ($ post) के साथ एक पूर्ण मिला; और मैं आपकी पोस्ट जेसन से पार्स नहीं कर रहा हूं। लेकिन जब मैं इसे आज़माता हूं: $ क्लाइंट-> setRawData ($ परीक्षण, 'स्ट्रिंग') -> अनुरोध ('पोस्ट'); जहां परीक्षण एक स्ट्रिंग है, फिर भी यह मुझे अभी भी कुछ भी नहीं देता है? – 1291

+0

यकीन नहीं है कि यह आपके लिए क्यों काम नहीं करता है। मैंने कोड में नियंत्रक कार्यों दोनों के लिए पूर्ण कोड जोड़ा। अनुरोध के लिए आपके पास जो कुछ था, वह ज्यादातर कॉपी/पेस्ट है। उम्मीद है कि आप वह काम कर सकते हैं। सुनिश्चित करें कि आप नवीनतम जेडएफ संस्करण 1.12.0 का उपयोग कर रहे हैं। मैंने 1.11.13 के साथ परीक्षण किया और यह उस संस्करण के साथ भी काम किया। – drew010

+0

स्पष्ट रूप से मैं डेटा को सही तरीके से नहीं भेज रहा था ... यही वह है जो मैंने बदला: $ data = array ('num' => '1234'); $ डेटास्ट्रिंग = ""; ... सर्वर पक्ष पर मैंने यह किया: $ यह-> अनुरोध-> getParam ('num') $ this-> json-> sendData ($ डेटा); .. और यह अब काम करता है :)! सभी मदद के लिए धन्यवाद! इसकी प्रशंसा करना! – 1291

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