6

我一直在 stackoverflow 和 Google 上寻找解决问题的方法。

我已经使用 Zend Framework 创建了两个项目 -Project1并且Project2- 我想在其中一个上实现 Web 服务。这个想法是使用 POST 发送一个 JSON 字符串Project1并接收一个 JSON,其中包含与该变量相关的所有详细信息。现在我在以下位置创建了一个 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://input 文件但得到一个空字符串...

我错过了什么???从早上开始,我一直在寻找它,但没有找到解决方案。

提前感谢您的回复。

4

1 回答 1

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 编码的内容。

dataAction如果您想在 POST 正文中接收 JSON 数据,解决方案是使用类似的东西。

$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;
}
于 2012-09-24T19:38:54.257 回答