2012-09-24 52 views
6

我一直在搜索所有的stackoverflow和谷歌解決我的問題。Zend_HTTP_Client不會讓我POST任何數據

我用Zend Framework創建了兩個項目 - Project1Project2 - 我想在其中的一個上實現Web服務。這個想法是發送一個JSON字符串到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控制器中讀取dataAction,並給出任何迴應的輸出。但是,當我試試這個:

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();  

} 

我得到這樣的輸出:NULL陣列(0){} ....當我在客戶端嘗試時,我得到相同的輸出。另外提及..我也嘗試打開php://輸入文件,但得到了一個空字符串...

我失蹤了什麼?自上午以來,我一直在尋找它,但沒有得到解決。

在此先感謝您的回覆。

回答

5

這裏是你錯過了什麼:

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

發送POST請求,但在POST主體中的數據不是一個URL編碼的字符串,取而代之的則是剛生JSON。

調用$this->getRequest()->getParam('foo')查看PHP超全景圖$_GET$_POST,它不包含任何JSON參數。它將被清空的原因是因爲PHP無法解析POST數據,因爲它是JSON而不是HTTP URL編碼的內容。

如果您想要在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)和var(dump)($ post)與布爾(假)的NULL;我同意你的帖子json不被解析。但是當我嘗試這樣的: $ client-> setRawData($ test,'String') - > request('POST');在哪裏測試是一個字符串 它仍然給我什麼,但NULL? – 1291

+0

不知道爲什麼它不適合你。我在代碼中添加了兩個控制器操作的完整代碼。這主要是您對請求的複製/粘貼。希望你能做到這一點。確保您使用的是最新的ZF版本1.12.0。我使用1.11.13進行了測試,它也適用於該版本。 – drew010

+0

顯然我沒有正確地發送數據...這是我改變了:$ data = array('num'=>'1234'); $ dataString =「」; ...在服務器端我做到了這一點:$ this-> request-> getParam('num')$ this-> json-> sendData($ data); ..現在它工作:)! 感謝您的幫助!欣賞它! – 1291