Por que obtenho "SOAP-ERROR: Analisando WSDL: Não foi possível encontrar <definições>"?

8

Estou tentando configurar um cliente SOAP em um servidor para se comunicar com o Magento em um servidor de teste. Ambos os servidores têm a extensão SOAP do PHP instalada, configurada e exibida phpinfo().

Tentei desativar o cache, usando as APIs v2 e v1 e tudo mais que eu conseguia pensar. Independentemente disso, continuo tendo os mesmos problemas.

Ou é:

<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>

ou às vezes outro erro SOAP doesn't allow DTD....

Agora estou usando apenas o código de exemplo simples do Magento daqui , em vez de executar algo significativo, até que eu possa descobrir o que está acontecendo com isso.

Se eu fizer file_get_contentso URL do serviço, recebo:

<?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>

Parece que não deve ter problemas para analisar isso .. idk.

Garet Claborn
fonte

Respostas:

17

Aparentemente, fui vítima de uma armadilha comum do Magento, por isso estou postando a resposta no caso de alguém mais estar pesquisando esse erro específico. Basicamente, o erro vinha da instalação do Magento que eu estava tentando chamar por meio da API SOAP.

Inicialmente, pensei que o erro foi gerado pelo cliente não conseguir localizar esse resultado de definições, no entanto, a situação real é a seguinte.

  • A instalação do Magento que atua como um servidor SOAP faz algumas chamadas do cliente SOAP para si mesma.
  • Essas chamadas pesquisam o mesmo domínio que você está acessando no script do cliente, mas são originárias do servidor no qual o domínio está hospedado e fazem um loopback no servidor em questão.
  • Portanto, você precisa verificar o arquivo host, geralmente em / etc / hosts, para obter as distribuições do Linux e tentar anexar Your.IP.Address.Here Your.Magento.Domain(i, e 70.0.0.2 magentohost.com)
  • Certifique-se de que iptablespermita conexões de loopback, especialmente se você tentar executar o host local em vez do seu IP externo; mas provavelmente você precisará usar o endereço IP externo.

É isso aí; depois que editei o arquivo: /etc/hostse adicionei essa linha, tudo funcionou bem.

Se alguém tiver uma visão mais clara ou uma resposta geralmente melhor - sinta-se à vontade para postar e provavelmente será aceito sobre essa resposta.

Garet Claborn
fonte
Isso não me ajudou a consertá-lo ... Qualquer outro palpite, qual poderia ser o motivo?
Usman Yousaf