Zend_HTTP_Client не позволяет мне размещать любые данные

Я искал во всем стеке потока и Google для решения моей проблемы.

Я создал два проекта с Zend Framework - Project1 а также Project2 - и я хочу реализовать веб-сервисы на одном из них. Идея состоит в том, чтобы отправить JSON-строку Project1 и получить обратно JSON со всеми деталями, связанными с этой переменной, используя POST. Теперь я создал TestController на 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();

}

Приведенный выше код работает. Это читает dataAction от 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();      

}

Я получаю вывод этого: NULL array(0) { } .... Я получаю такой же вывод, когда пытаюсь сделать это на стороне клиента. Также упомянуть.. Я также попытался открыть входной файл php://, но получил пустую строку...

Что мне не хватает??? Я разочаровался в поисках этого с утра, но не нашел решения.

Заранее спасибо за ответ.

1 ответ

Решение

Вот что вам не хватает:

$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-адрес.

Решение состоит в том, чтобы использовать что-то подобное в dataAction если вы хотите получить данные JSON в теле 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.";
}

Изменить: Вот полный код, с которым вы можете связываться.

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;
}
Другие вопросы по тегам