Почему я получаю сообщение «SOAP-ERROR: парсинг WSDL: не удалось найти <определения>»?

8

Я пытаюсь настроить клиент SOAP на одном сервере для связи с Magento на тестовом сервере. На обоих серверах установлено, настроено и показано расширение PHP SOAP phpinfo().

Попытался отключить кеширование, используя API v2 и v1 и все остальное, что я мог придумать. Несмотря на это, я продолжаю получать те же проблемы.

Либо его:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <SOAP-ENV:Fault>
            <faultcode>SOAP-ENV:Server</faultcode>
                <faultstring>
                    Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: 
                    Couldn't find <definitions> in 'http://myserver.com/api/v2_soap?wsdl=1' 
                    in dispatch.php:39 

                    Stack trace: #0 dispatch.php(39): 
                    SoapClient->SoapClient('http://myserver.com/...', Array) #1 {main} thrown
                </faultstring>
        </SOAP-ENV:Fault>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

или иногда другая ошибка SOAP doesn't allow DTD....

Я сейчас , используя только простой Magento пример кода из здесь , вместо того , чтобы что - нибудь существенное, пока я не могу понять, что происходит с этим.

Если я обращаюсь file_get_contentsк URL службы, я получаю:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:typens="urn:Magento" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" name="Magento" targetNamespace="urn:Magento">
    <types>
    <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:Magento">
        <import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="http://schemas.xmlsoap.org/soap/encoding/"/>
        <complexType name="associativeEntity">
        <all>
            <element name="key" type="xsd:string"/>
            <element name="value" type="xsd:string"/>
        </all>
        </complexType>
        .
        .
        .
</definitions>

Похоже, что не должно быть проблем с анализом этого ... ИДК.

Гарет Клаборн
источник

Ответы:

17

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

Сначала я думал, что ошибка была сгенерирована тем, что клиент не смог найти результат этого определения, однако реальная ситуация такова.

  • Установка Magento, действующая как SOAP-сервер, делает некоторые запросы SOAP-клиентов к себе.
  • Эти вызовы выполняют поиск в том же домене, к которому вы обращаетесь в клиентском скрипте, но исходят от сервера, на котором этот домен размещен, и возвращаются на указанный сервер.
  • Для этого вам нужно проверить файл хоста, обычно в / etc / hosts для дистрибутивов Linux, и попытаться добавить Your.IP.Address.Here Your.Magento.Domain(i, e 70.0.0.2 magentohost.com)
  • Убедитесь, что iptablesразрешены петлевые соединения, особенно если вы пытаетесь запустить localhost вместо вашего внешнего IP; но, скорее всего, вам нужно будет использовать внешний IP-адрес.

Это оно; как только я отредактировал файл: /etc/hostsи добавил эту одну строку, все работало нормально.

Если у кого-то есть более четкое понимание или вообще лучший ответ - пожалуйста, не стесняйтесь писать, и это, скорее всего, будет принято поверх этого ответа.

Гарет Клаборн
источник
Это не помогло мне это исправить .. Любое другое предположение, что может быть причиной?
Усман Юсаф,