¿Por qué obtengo "SOAP-ERROR: Analizando WSDL: No se pudieron encontrar <definiciones>"?

8

Estoy tratando de configurar un cliente SOAP en un servidor para comunicarme con Magento en un servidor de prueba. Ambos servidores tienen instalada, configurada y mostrada la extensión SOAP de PHP phpinfo().

Intenté desactivar el almacenamiento en caché, utilizando las API v2 y v1 y todo lo demás que se me ocurrió. De todos modos, sigo teniendo los mismos problemas.

O bien es:

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

o a veces otro error SOAP doesn't allow DTD....

Ahora estoy usando solo el código de ejemplo simple de Magento desde aquí , en lugar de ejecutar algo significativo, hasta que pueda descubrir qué está pasando con esto.

Si hago file_get_contentsa la URL del servicio, obtengo:

<?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 no debería tener problemas para analizar esto ... idk.

Garet Claborn
fuente

Respuestas:

17

Aparentemente caí presa de una trampa común de Magento, así que publico la respuesta en caso de que alguien más esté buscando este error en particular. Básicamente, el error provenía de la instalación de Magento que estaba tratando de llamar a través de la API SOAP.

Inicialmente pensé que el error fue generado por el cliente al no poder localizar el resultado de esta definición, sin embargo, la situación real es la siguiente.

  • La instalación de Magento, que actúa como un servidor SOAP, realiza algunas llamadas de clientes SOAP.
  • Estas llamadas buscan el mismo dominio al que está accediendo en su script de cliente, pero se originan en el servidor en el que está alojado ese dominio y regresan a dicho servidor.
  • Por lo tanto, debe verificar su archivo de host, generalmente en / etc / hosts para las distribuciones de Linux e intentar agregar Your.IP.Address.Here Your.Magento.Domain(i, e 70.0.0.2 magentohost.com)
  • Asegúrese de que iptablespermite conexiones de bucle invertido, especialmente si intenta ejecutar localhost en lugar de su IP externa; pero lo más probable es que necesites usar la dirección IP externa.

Eso es; una vez que edité el archivo: /etc/hostsy agregué esta línea, todo funcionó bien.

Si alguien tiene una idea más clara o una respuesta generalmente mejor, no dude en publicar y es muy probable que se acepte esta respuesta.

Garet Claborn
fuente
Esto no me ayudó a arreglarlo ... ¿Alguna otra adivinanza cuál podría ser la razón?
Usman Yousaf