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


SOAP Client Error: "Error Fetching Http Headers"

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

我一直在寻找,我遇到的解决方案是将default_socket_timeout从60秒增加到120秒,但这对我来说不起作用,我还看到了另一个解决方案,它关闭了我的apache KeepAlive中的vhost,但没有起作用。

WSDL工作得很好,因为我尝试在另一台计算机上使用它,它也能工作。

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

很抱歉,但我不知道您正在使用什么来设置SOAP服务。。。。。

如果你能提供更多关于你的SOAP服务的信息(poss Zend_SOAP给了Zend Framework标签)等,那就太好了。

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

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

更新:好的,所以我意识到我昨天提到的例子没有完全实现,所以我很快就把一些东西拼凑在一起,你可以试着看看它在你的环境中是否有效。

代码是我在这里找到的东西(Zend_Soap_Server的一个示例)和另一个SO问题(基本Soap服务测试的一个例子)的混合。

我在最后使用ZF 1.11对其进行了测试,我所概述的示例使用了新ZF项目中获得的默认应用程序路径(例如,模型位于Application/models目录中,因此显示的模型指向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;
        }
    }
}

在上面的类中,WSDL是使用Zend_Soap_Autodiscover自动生成的,并使用application/models/SoapService.php中的SoapServicephp文件作为模板。请注意,目标类中每个方法上面的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()代码中获取一条成功消息,其中包含您在客户端请求中指定的字符串作为消息的一部分。

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

星期一我可以再看一次。