Warum erhalte ich "SOAP-ERROR: Analyse von WSDL: <Definitionen> konnte nicht gefunden werden"?

8

Ich versuche, einen SOAP-Client auf einem Server für die Kommunikation mit Magento auf einem Testserver einzurichten. Auf beiden Servern ist die SOAP-Erweiterung von PHP installiert, konfiguriert und wird in angezeigt phpinfo().

Ich habe versucht, das Caching mit den APIs v2 und v1 und allem anderen, was mir einfällt, auszuschalten. Trotzdem bekomme ich immer die gleichen Probleme.

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

oder manchmal ein anderer Fehler SOAP doesn't allow DTD....

Ich verwende jetzt nur den einfachen Magento-Beispielcode von hier , anstatt irgendetwas Bedeutendes auszuführen, bis ich herausfinden kann, was damit los ist.

Wenn ich file_get_contentsmit der Service-URL mache , bekomme ich:

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

Es scheint also, dass es keine Probleme geben sollte, dies zu analysieren.

Garet Claborn
quelle

Antworten:

17

Anscheinend bin ich einer häufigen Magento-Falle zum Opfer gefallen, daher poste ich die Antwort für den Fall, dass jemand anderes diesen bestimmten Fehler sucht. Grundsätzlich kam der Fehler von der Magento-Installation, die ich über die SOAP-API aufrufen wollte.

Anfangs dachte ich, dass der Fehler dadurch generiert wurde, dass der Client dieses Definitionsergebnis nicht finden konnte, aber die reale Situation ist wie folgt.

  • Die Magento-Installation, die als SOAP-Server fungiert, führt einige SOAP-Client-Aufrufe an sich selbst aus.
  • Diese Aufrufe suchen dieselbe Domäne, auf die Sie in Ihrem Client-Skript zugreifen, stammen jedoch von dem Server, auf dem diese Domäne gehostet wird, und führen einen Loopback zu diesem Server durch.
  • Daher müssen Sie Ihre Host-Datei überprüfen, normalerweise unter / etc / hosts für Linux-Distributionen, und versuchen, Your.IP.Address.Here Your.Magento.Domain(i, e 70.0.0.2 magentohost.com) anzuhängen.
  • Stellen iptablesSie sicher, dass Loopback-Verbindungen zulässig sind, insbesondere wenn Sie versuchen, localhost anstelle Ihrer externen IP-Adresse auszuführen. Höchstwahrscheinlich müssen Sie jedoch die externe IP-Adresse verwenden.

Das ist es; Nachdem ich die Datei bearbeitet /etc/hostsund diese eine Zeile hinzugefügt hatte, funktionierte alles einwandfrei.

Wenn jemand klarere Einsichten oder eine allgemein bessere Antwort hat - zögern Sie nicht zu posten und es wird höchstwahrscheinlich über diese Antwort akzeptiert.

Garet Claborn
quelle
Das hat mir nicht geholfen, das Problem zu beheben. Irgendwelche anderen Vermutungen, was der Grund sein könnte?
Usman Yousaf