2012-09-24 10 views
6

Ho cercato tutto lo stackoverflow e Google per una soluzione al mio problema.Zend_HTTP_Client non mi consente di postare alcun dato

Ho creato due progetti con Zend Framework - Project1 e Project2 - e voglio implementare servizi Web su uno di essi. L'idea è di inviare una stringa JSON a Project1 e ricevere un JSON con tutti i dettagli associati a tale variabile usando il POST. Ora ho creato un TestController su 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(); 

} 

Il codice precedente funziona. Legge il dataAction dal controller Project1 e mi dà un risultato di ciò che viene echeggiato. Ma quando provo questo:

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

} 

E sul lato server quando provo la visualizzazione all'interno dataAction:

public function dataAction(){ 

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

    var_dump($_POST); 

    die();  

} 

ottengo un output di questo: array NULL (0) {} .... Ottengo lo stesso risultato quando lo provo sul lato client. Anche per citare .. Ho anche provato ad aprire il file di input php: // ma ho ottenuto una stringa vuota ...

Cosa mi manca ??? Mi sono frustrato a cercare su di esso sin dal mattino, ma non ho trovato soluzione.

Grazie in anticipo per la risposta.

risposta

5

Ecco cosa ti manca:

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

invia una richiesta POST, ma i dati del corpo post non è una stringa con codifica URL, invece si tratta solo di JSON crudo.

La chiamata $this->getRequest()->getParam('foo') chiama i superglobali PHP $_GET e $_POST che non contengono nessuno dei parametri JSON. Il motivo per cui sarà vuoto è perché PHP non è stato in grado di analizzare i dati POST poiché era JSON e non il contenuto con codifica url HTTP.

La soluzione è di utilizzare qualcosa di simile nello dataAction se si desidera ricevere dati JSON nel corpo del 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."; 
} 

Modifica: qui è il codice completo con cui si può confondere.

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

Felice di avere una risposta rapida. Come hai detto, ho provato a usare quel codice, ma ho ottenuto un NULL con var_dump ($ json) e bool (false) con var_dump ($ post); e sono d'accordo che il tuo post non venga analizzato. Ma quando provo questo: $ client-> setRawData ($ test, 'String') -> request ('POST'); dove test è una stringa non mi dà altro che NULL? – 1291

+0

Non sei sicuro del motivo per cui non ha funzionato per te. Ho aggiunto il codice completo per entrambe le azioni del controller nel codice. È principalmente una copia/incolla di ciò che hai avuto per la richiesta. Spero che tu possa farlo funzionare. Assicurati di utilizzare l'ultima versione ZF 1.12.0. Ho provato con 1.11.13 e ha funzionato anche con quella versione. – drew010

+0

Apparentemente non stavo inviando i dati correttamente ... questo è quello che ho cambiato: $ data = array ('num' => '1234'); $ dataString = ""; ... Mentre sul lato server ho fatto questo: $ this-> request-> getParam ('num') $ this-> json-> sendData ($ data); .. e ora funziona :)! Grazie per tutto l'aiuto! Apprezzalo! – 1291

Problemi correlati