Php Zend_HTTP_客户端不允许我发布任何数据

Php Zend_HTTP_客户端不允许我发布任何数据,php,web-services,zend-framework,zend-http-client,Php,Web Services,Zend Framework,Zend Http Client,我一直在stackoverflow和Google搜索我的问题的解决方案 我已经用Zend Framework创建了两个项目——Project1和Project2——我想在其中一个项目上实现web服务。我们的想法是向Project1发送一个JSON字符串,然后使用POST返回一个JSON,其中包含与该变量相关的所有详细信息。现在,我已经在Project2上创建了一个TestController: public function indexAction(){ $uri = 'http://

我一直在stackoverflow和Google搜索我的问题的解决方案

我已经用Zend Framework创建了两个项目——
Project1
Project2
——我想在其中一个项目上实现web服务。我们的想法是向
Project1
发送一个JSON字符串,然后使用POST返回一个JSON,其中包含与该变量相关的所有详细信息。现在,我已经在
Project2
上创建了一个TestController:

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

}
上述代码有效。它从
Project1
控制器读取
dataAction
,并向我提供任何回声的输出。但当我尝试这个:

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

}
我得到以下输出:空数组(0){}。。。。当我在客户端尝试时,我得到了相同的输出。还有。。我还试着打开门php://input 文件,但得到一个空字符串

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


提前感谢您的回复。

以下是您缺少的内容:

$json = json_encode($data);
$client->setRawData($json, 'application/json')->request('POST');
发送POST请求,但POST正文中的数据不是url编码的字符串,而是原始JSON

调用
$this->getRequest()->getParam('foo')
将查看不包含任何JSON参数的PHP超全局变量
$\u GET
$\u POST
。它将为空的原因是PHP无法解析POST数据,因为它是JSON而不是HTTP url编码的内容

如果希望在POST正文中接收JSON数据,解决方案是在
dataAction
中使用类似的内容

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

很高兴有一个快速的反应。正如您所说,我尝试使用该代码,但我得到了一个空值(var_dump($json)和bool(false)值(var_dump($post);我同意你的帖子没有被解析。但当我尝试这样做时:$client->setRawData($test,'String')->request('POST');当test是一个字符串时,它仍然只给我NULL?不知道为什么它对您不起作用。我在代码中添加了两个控制器操作的完整代码。它主要是对您的请求的复制/粘贴。希望你能做到。确保您使用的是最新的ZF版本1.12.0。我用1.11.13进行了测试,它也适用于该版本。显然我没有正确发送数据。。。这就是我所改变的:$data=array('num'=>'1234')$数据字符串=”。。。在服务器端,我这样做:$this->request->getParam('num')$this->json->sendData($data);。。现在它可以工作了:)!谢谢你的帮助!谢谢你!我爱你。谢谢你终于给了我一个答案,让我在一天工作12个小时后回家……我可以在哪里为一个邮件输入一个自定义端口号?在URL中正确吗$uri='';