SOAP客户端错误:“获取Http标头时出错”

时间:2012-01-25 17:41:41

标签: php linux zend-framework soap wsdl

我正在尝试在我的计算机中使用SOAP客户端 - 服务器并且它看起来不会起作用,我收到此错误当我尝试运行我的SOAP客户端时错误获取Http标头。

我一直在寻找,我已经解决的解决方案是将default_socket_timeout从60秒增加到120秒并且它对我不起作用,我也看到了另一种解决方案,即将vhost放入我的apache KeepAlive Off并且那没用。

WSDL工作正常,因为我尝试在另一台计算机上使用它并且它可以工作。

我使用Zend Framework在Linux Mint中运行PHP版本5.3.5-1ubuntu7.4,希望你们中的一些人可以帮我解决这个问题。谢谢。

1 个答案:

答案 0 :(得分:0)

对不起,我不知道你用什么设置你的SOAP服务......

如果您可以提供有关您的SOAP服务的更多信息(在Zend Framework标签中使用Zend_Soap),那将是非常好的。

此外,作为一种快速替代方案,您说您已经在另一台计算机上查看过WSDL,也许在另一种环境中尝试应用程序以确保它不是环境问题。

您的客户端 - 服务器代码可能是一个简单的问题。

更新:好的,所以我意识到我昨天提到的例子没有完全实现,所以我很快就一起攻击了一些东西,你可以试着看看它是否适用于你的环境。

代码是我发现的here (an example of Zend_Soap_Server)和来自另一个SO问题here (an example of a basic SOAP service test)的混合物。

我使用ZF 1.11测试了我的结果,我概述的示例使用了新ZF项目的默认应用程序路径(例如模型在目录应用程序/模型中,因此显示的模型是领导了Application_Model_Classname)。

如果它有效,你可以相应调整....如果它不起作用,我们可以尝试其他的东西。 首先创建一个新的SOAP控制器并按如下方式设置类:

<?php
class SoapController extends Zend_Controller_Action
{

    public function init()
    {
        ini_set("soap.wsdl_cache_enabled", "0");     //disable WSDL caching
        $this->_helper->layout()->disableLayout();   //disable the layout
        $this->_helper->viewRenderer->setNoRender(); //disable the view
    }

    public function indexAction ()
    {
        if (isset($_GET['wsdl'])) {
            //return the WSDL
            $this->handleWSDL();
        } else {
            //handle SOAP request
            $this->handleSOAP();
        }
    }

    private function handleWSDL ()
    {
        $strategy = new Zend_Soap_Wsdl_Strategy_AnyType();
        $autodiscover = new Zend_Soap_AutoDiscover();
        $autodiscover->setComplexTypeStrategy($strategy);
        $autodiscover->setClass('Application_Model_SoapService');
        $autodiscover->handle();
    }

    private function handleSOAP ()
    {
        $server = new Zend_Soap_Server(null, 
        array('uri' => "http://YOURDOMAIN/soap?wsdl"));
        $server->setClass("Application_Model_SoapService");
        $server->handle();
    }

    public function testAction()
    {
        $client = new Zend_Soap_Client("http://YOURDOMAIN/soap?wsdl");
        try {
            echo $client->testMethod('test'); 
        } catch (Exception $e) {
            echo $e;
        }
    }

}

在上面的类中,使用Zend_Soap_Autodiscover自动生成WSDL,并在application / models / SoapService.php中使用SoapService.php文件作为模板。请注意,目标类中每个方法上面的DocBock注释都是此过程的组成部分。

接下来在默认模型文件夹中创建SoapService.php文件:

<?php
class Application_Model_SoapService
{
    /**
    * testMethod
    *  
    * @param string $string 
    * @return string $testSuccess
    */    
    public function testMethod(string $string)
    {
        $testSuccess = 'Test successful, the message was: ' . $string;          
        return $testSuccess;
    }       

}

如果一切正常,您可以访问:

http://YOURDOMAIN/soap?wsdl

查看WSDL并访问:

http://YOURDOMAIN/soap/test

使用您在SoapController类中的testAction()代码中的客户端请求中指定的字符串获取成功消息,作为消息的一部分。

让我知道它是否有效,我们可以从那里开始。

星期一,我可以再看看。