2012-09-24 31 views
6

He estado buscando en todo stackoverflow y en Google para encontrar una solución a mi problema.Zend_HTTP_Client no me dejará PUBLICAR ningún dato

He creado dos proyectos con Zend Framework - Project1 y Project2 - y deseo implementar servicios web en uno de ellos. La idea es enviar una cadena JSON al Project1 y recibir de vuelta un JSON con todos los detalles asociados con esa variable usando POST. Ahora he creado un TestController en 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(); 

} 

funciona el código de seguridad. Lee el dataAction del controlador Project1 y me da una salida de todo lo que se repite. Pero cuando intento esto:

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

} 

Y en el lado del servidor cuando intento mostrar el interior dataAction:

public function dataAction(){ 

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

    var_dump($_POST); 

    die();  

} 

consigo una salida de esta: array NULL (0) {} .... Obtengo el mismo resultado cuando lo intento en el lado del cliente. También mencionar ... También intenté abrir el archivo de entrada php: // pero obtuve una cadena vacía ...

¿Qué me estoy perdiendo? Me he frustrado buscando desde la mañana pero no encontré ninguna solución.

Gracias de antemano por la respuesta.

Respuesta

5

Esto es lo que se echa en falta:

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

envía una solicitud POST, pero los datos en el cuerpo post no es una cadena con codificación URL, sino que es simplemente JSON prima.

Llamando $this->getRequest()->getParam('foo') mira los superglobales de PHP $_GET y $_POST que no contendrán ninguno de los parámetros de JSON. La razón por la que estará vacío es porque PHP no pudo analizar los datos POST ya que era JSON y no contenido codificado por URL HTTP.

La solución es usar algo como esto en el dataAction si desea recibir datos JSON en el cuerpo 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."; 
} 

Editar: Aquí está el código completo con el que puedes meterse.

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

Me alegra tener una respuesta rápida. Como dijiste, traté de usar ese código, pero obtuve un NULL con var_dump ($ json) y bool (falso) con var_dump ($ post); y estoy de acuerdo con que tu publicación json no se haya analizado. Pero cuando intento esto: $ client-> setRawData ($ test, 'String') -> request ('POST'); donde la prueba es una cadena ¿todavía no me da nada más que NULL? – 1291

+0

No estoy seguro de por qué no funcionó para usted. Agregué el código completo para ambas acciones del controlador en el código. Es principalmente una copia/pega de lo que tenía para la solicitud. Espero que puedas hacer que funcione. Asegúrese de estar utilizando la última versión de ZF 1.12.0. Probé con 1.11.13 y también funcionó con esa versión. – drew010

+0

Aparentemente no estaba enviando los datos correctamente ... esto es lo que cambié: $ data = array ('num' => '1234'); $ dataString = ""; ... Mientras que en el lado del servidor hice esto: $ this-> request-> getParam ('num') $ this-> json-> sendData ($ data); .. y ahora funciona :)! ¡Gracias por toda la ayuda! ¡Lo aprecio! – 1291

Cuestiones relacionadas