2012-09-24 9 views
6

Przeszukałem cały stackoverflow i Google dla rozwiązania mojego problemu.Zend_HTTP_Client Nie pozwól mi POST żadnych danych

Stworzyłem dwa projekty z Zend Framework - Project1 i Project2 - i chcę wdrożyć usługi internetowe na jednym z nich. Chodzi o to, aby wysłać ciąg JSON do Project1 i odebrać JSON ze wszystkimi szczegółami związanymi z tą zmienną za pomocą POST. Teraz stworzyliśmy TestController na Project2:

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

} 

Powyższy kod działa. Odczytuje on dataAction ze sterownika Project1 i podaje mi wynik tego, co jest echo. Ale gdy próbuję to:

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

} 

A po stronie serwera, gdy próbuję wyświetlanie wewnątrz dataAction:

public function dataAction(){ 

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

    var_dump($_POST); 

    die();  

} 

uzyskać moc to: NULL array (0) {} .... Otrzymuję ten sam wynik, gdy próbuję go po stronie klienta. Wspomnę też ... Próbowałem również otworzyć plik wejściowy php: //, ale dostałem pusty ciąg ...

Czego mi brakuje? Frustrowałem się, szukając go od rana, ale nie miałem rozwiązania.

Z góry dziękuję za odpowiedź.

Odpowiedz

5

Oto czego brakuje:

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

wysyła żądanie POST ale dane w organizmie post nie jest zakodowany ciąg znaków, a nie jest to tylko surowy JSON.

Wywołanie $this->getRequest()->getParam('foo') wygląda na superglobale PHP $_GET i $_POST, które nie będą zawierały żadnego z parametrów JSON. Powodem, dla którego będzie pusta, jest to, że PHP nie może parsować danych POST, ponieważ jest to JSON, a nie treść zakodowana w HTTP.

Rozwiązaniem jest użycie czegoś podobnego w dataAction, jeśli chcesz otrzymywać dane JSON w treści POST.

$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."; 
} 

Edytuj: Oto pełny kod, z którym możesz zadzierać.

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

Cieszę się, że mam szybką odpowiedź. Jak już powiedziałeś, próbowałem użyć tego kodu, ale dostałem NULL z var_dump ($ json) i bool (false) z var_dump ($ post); i zgadzam się z tym, że twój post json nie jest analizowany. Ale kiedy próbuję to: $ client-> setRawData ($ test, 'String') -> request ('POST'); gdzie test jest ciągiem nadal daje mi tylko NULL? – 1291

+0

Nie wiem, dlaczego to nie zadziałało. Dodałem pełny kod dla obu akcji kontrolera w kodzie. Jest to głównie kopia/wklej tego, co masz na prośbę. Mam nadzieję, że możesz to sprawić. Upewnij się, że używasz najnowszej wersji ZF 1.12.0. Testowałem w wersji 1.11.13 i działało również z tą wersją. – drew010

+0

Najwyraźniej nie wysyłałem danych poprawnie ... to się zmieniło: $ data = array ('num' => '1234'); $ dataString = ""; ... Po stronie serwera zrobiłem to: $ this-> request-> getParam ('num') $ this-> json-> sendData ($ data); .. i teraz działa :)! Dzięki za pomoc! Doceniam to! – 1291