【问题标题】:Zend_HTTP_Client wont let me POST any dataZend_HTTP_Client 不会让我发布任何数据
【发布时间】:2012-09-24 19:23:37
【问题描述】:

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

我已经使用 Zend 框架创建了两个项目 - Project1Project2 - 我想在其中一个上实现 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();      

}

我得到这样的输出:NULL array(0) { } ...。当我在客户端尝试它时,我得到相同的输出。还要提一下..我也尝试打开 php://input 文件但得到一个空字符串...

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

提前感谢您的回复。

【问题讨论】:

    标签: php web-services zend-framework zend-http-client


    【解决方案1】:

    这是你所缺少的:

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

    发送一个 POST 请求,但 POST 正文中的数据不是 url 编码的字符串,而只是原始 JSON。

    调用$this->getRequest()->getParam('foo') 会查看不包含任何JSON 参数的PHP 超全局变量$_GET$_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;
    }
    

    【讨论】:

    • 很高兴得到快速响应。正如你所说,我尝试使用该代码,但我得到一个 NULL 和 var_dump($json) 和 bool(false) 和 var_dump($post);我同意你的帖子 json 没有被解析。但是当我尝试这个时: $client->setRawData($test, 'String')->request('POST');其中 test 是一个字符串,它仍然只给我 NULL ?
    • 不知道为什么它不适合你。我在代码中添加了两个控制器操作的完整代码。它主要是您对请求的复制/粘贴。希望你能得到它的工作。确保您使用的是最新的 ZF 版本 1.12.0。我使用 1.11.13 进行了测试,它也适用于该版本。
    • 显然我没有正确发送数据......这就是我改变的: $data = array('num' => '1234'); $dataString = ""; ...虽然在服务器端我这样做了: $this->request->getParam('num') $this->json->sendData($data);.. 现在它可以工作了:)!感谢所有的帮助!欣赏!
    • 我爱你。谢谢你终于给了我答案,让我在一天 12 小时后回家......
    • 我可以在哪里为 POST 设置自定义端口号?在网址中正确吗? $uri = 'playground:8080/zendapp/public/index/data';
    猜你喜欢
    • 1970-01-01
    • 2020-02-24
    • 2011-05-13
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    • 2020-05-07
    • 2017-08-25
    • 1970-01-01
    相关资源
    最近更新 更多