Ошибка клиента SOAP: «Ошибка при получении заголовков Http» - PullRequest
1 голос
/ 25 января 2012

Я пытаюсь использовать клиент-сервер SOAP на моем компьютере, и похоже, что он не будет работать, я получаю эту ошибку Ошибка при получении заголовков Http при попытке запустить мой клиент SOAP.

Я искал, и решение, которое я нашел, заключается в увеличении default_socket_timeout с 60 до 120 секунд, и это не работает для меня, также я видел другое решение, которое помещает vhost в мой apache KeepAlive Off это не сработало.

WSDL работает нормально, потому что я пытаюсь использовать его на другом компьютере, и он работает.

Я использую PHP версии 5.3.5-1ubuntu7.4 в Linux Mint с использованием Zend Framework. Надеюсь, некоторые из вас помогут мне это исправить.

1 Ответ

0 голосов
/ 26 января 2012

Извините, но я не знаю, что вы используете для настройки службы SOAP .....

Если бы вы могли предоставить больше информации о вашей службе SOAP (возможно, 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 с файлом SoapService.php в файле application / models / 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

для получения сообщения об успехе со строкой, указанной вами в запросе клиента в коде testAction () в классе SoapController, как часть сообщения.

Дайте мне знать, работает ли он или нет, и мы можем идти оттуда.

Я смогу еще раз посмотреть в понедельник.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...