PHP SoapClient __call () исключение: DTD не поддерживаются SOAP - PullRequest
1 голос
/ 16 июня 2011

Этот меня убивает ...

В настоящее время я учусь разрабатывать серверы SOAP на PHP, и у меня возникла досадная проблема, и Google не сильно помогает, несмотря на множествопопаданий по рассматриваемой проблеме ...

После создания SOAP-КЛИЕНТА с использованием того, что я считаю хорошим WSDL, первый вызов существующей функции на мыльном сервере генерирует следующее исключение:

SoapFault Object
(
    [message:protected] => DTD are not supported by SOAP
    [string:private] => 
    [code:protected] => 0
    [file:protected] => /var/www/soapserver/soapServerTestClient.php
    [line:protected] => 7
    [trace:private] => Array
        (
            [0] => Array
                (
                    [function] => __call
                    [class] => SoapClient
                    [type] => ->
                    [args] => Array
                        (
                            [0] => testSoapService
                            [1] => Array
                                (
                                    [0] => TESTSTRING
                                )

                        )

                )

            [1] => Array
                (
                    [file] => /var/www/soapserver/soapServerTestClient.php
                    [line] => 7
                    [function] => testSoapService
                    [class] => SoapClient
                    [type] => ->
                    [args] => Array
                        (
                            [0] => TESTSTRING
                        )

                )

        )

    [faultstring] => DTD are not supported by SOAP
    [faultcode] => Client
    [faultcodens] => http://schemas.xmlsoap.org/soap/envelope/
)

Дампирование __getLastRequest (), __getLastResponse (), __getLastRequestHeaders () и __getLastResponseHeaders () дает полностью ПУСТОЙ результат, поэтому НИЧЕГО на самом деле не отправляется / запрашивается, он появляется.

* 1009 посещенийссылка на WSDL возвращает содержимое файла WSDL, как и ожидалось, и я знаю, что это работает, потому что изменение пути к WSDL возвращает исключение SOAP-ERROR: Parsing WSDL: Couldn't load, а возвращение его к фактическому пути WSDL создает исключение выше.

код сервера мыла приведен ниже, но поскольку нет запросов / ответов, я не думаю, что это проблема:

function testSoapService ($ arg) {return ''. $ Arg. '';}

ini_set ("soap.wsdl_cache_enabled", "0");// отключаем кеш WSDL, чтобы можно было без проблем проверять изменения wsdl;закомментируйте, когда установлен WSDL.$ server = new SoapServer ("");$ Server-> AddFunction ( "testSoapService");$ server-> handle ();

При поиске в Google разные люди говорят, что это либо неверный путь wsdl (в этом случае так не думаю), либо тот факт, что сервервозвращение HTML-страниц с разновидностью ошибок (404 и т. д.) с веб-сервера, что, как мне кажется, также не так, потому что запросы / ответы пусты.

Вот копия содержимого WSDL, просто вЕсли это полезно:

<?xml version="1.0" encoding="UTF-8"?>

<wsdl:types>

    <schema xmlns:rns="http://soap.jrimer-amp64/" xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://soap.jrimer-amp64/" version="1.0" elementFormDefault="unqualified" attributeFormDefault="unqualified">
        <complexType name="testSoapServiceRequest">
            <sequence>
                <element name="testKey" type="string"/>
            </sequence>
        </complexType>
        <complexType name="testSoapServiceResponse">
            <sequence>
                <element name="result" type="string" minOccurs="1"/>
                <element name="retStatus" type="rns:returnStatus"/>
            </sequence>
        </complexType>
        <complexType name="returnStatus">
            <sequence>
                <element name="errorMessage" type="string" minOccurs="0"/>
                <element name="errorCode" type="string" minOccurs="0"/>
            </sequence>
            <attribute name="success" type="boolean"/>
        </complexType>
        <element name="addRouterToCustomerAccountRequest" type="rns:addRouterToCustomerAccountRequest"/>
        <element name="addRouterToCustomerAccountResponse" type="rns:addRouterToCustomerAccountResponse"/>
    </schema>

</wsdl:types>


<wsdl:service name="XxxxxxSvc">

    <wsdl:port name="XxxxxxSvc-Endpoint0" binding="tns:XxxxxxSvc-Endpoint0Binding">
        <soap:address location="http://soap.jrimer-amp64"/>
    </wsdl:port>

</wsdl:service>


<wsdl:portType name="portType">

    <wsdl:operation name="testSoapService">
        <wsdl:input message="tns:testSoapServiceRequest"/>
        <wsdl:output message="tns:testSoapServiceResponse"/>
    </wsdl:operation>

</wsdl:portType>


<wsdl:binding name="XxxxxxSvc-Endpoint0Binding" type="tns:portType">

    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />

    <wsdl:operation name="testSoapService">
        <soap:operation style="document" soapAction="http://soap.jrimer-amp64/XxxxxxSvc-SoapServer.php"/>
        <wsdl:input>
            <soap:body use="literal" parts="parameters"/>
        </wsdl:input>
        <wsdl:output>
            <soap:body use="literal" parts="parameters"/>
        </wsdl:output>
    </wsdl:operation>

</wsdl:binding>


<wsdl:message name="testSoapServiceRequest">
    <wsdl:part name="parameters" element="ns0:testSoapServiceRequest"/>
</wsdl:message>


<wsdl:message name="testSoapServiceResponse">
    <wsdl:part name="parameters" element="ns0:testSoapServiceResponse"/>
</wsdl:message>

Есть идеи?

1 Ответ

5 голосов
/ 16 июня 2011

Сброс __getLastRequest (), __getLastResponse (), __getLastRequestHeaders () и __getLastResponseHeaders () дает совершенно ПУСТОЙ результат, поэтому НИЧЕГО фактически не отправляется / запрашивается, он появляется.

* 1004Вы настроили свой клиент с параметрами trace, установленными на true?Это необходимо сделать до того, как методы dumpLastXXX будут работать.
...