Pourquoi est-ce que j'obtiens «SOAP-ERROR: Parsing WSDL: Can't find <definitions>»?

8

J'essaie de configurer un client SOAP sur un serveur pour communiquer avec Magento sur un serveur de test. L'extension SOAP de PHP est installée, configurée et apparaît dans les deux serveurs phpinfo().

J'ai essayé de désactiver la mise en cache, d'utiliser les API v2 et v1 et tout ce à quoi je pouvais penser. Quoi qu'il en soit, je continue d'avoir les mêmes problèmes.

Soit c'est:

<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 parfois une autre erreur SOAP doesn't allow DTD....

Je suis maintenant en utilisant simplement le code exemple Magento plaine d' ici , au lieu de courir quelque chose de significatif, jusqu'à ce que je peux comprendre ce qui se passe avec ça.

Si je fais file_get_contentsà l'URL du service, j'obtiens:

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

Il semble donc qu'il ne devrait pas avoir de mal à analyser ceci .. idk.

Garet Claborn
la source

Réponses:

17

Apparemment, je suis tombé en proie à un piège commun à Magento, donc je poste la réponse au cas où quelqu'un d'autre chercherait cette erreur particulière. Fondamentalement, l'erreur provenait de l'installation de Magento que j'essayais d'appeler via l'API SOAP.

Au départ, je pensais que l'erreur avait été générée par le client incapable de localiser le résultat de ces définitions, mais la situation réelle est la suivante.

  • L'installation de Magento qui agit comme un serveur SOAP effectue certains appels client SOAP.
  • Ces appels recherchent le même domaine auquel vous accédez dans votre script client, mais proviennent du serveur sur lequel ce domaine est hébergé et rebouclent vers ledit serveur.
  • Pour cela, vous devez vérifier votre fichier hôte, généralement dans / etc / hosts pour les distributions Linux et essayer d'ajouter Your.IP.Address.Here Your.Magento.Domain(i, e 70.0.0.2 magentohost.com)
  • Assurez-vous que les iptablesconnexions en boucle sont autorisées, surtout si vous essayez d'exécuter localhost au lieu de votre adresse IP externe; mais vous devrez probablement utiliser l'adresse IP externe.

C'est ça; une fois que j'ai édité le fichier: /etc/hostset ajouté cette ligne, tout a bien fonctionné.

Si quelqu'un a une idée plus claire ou une meilleure réponse générale - n'hésitez pas à poster et cela sera très probablement accepté par cette réponse.

Garet Claborn
la source
Cela ne m'a pas aidé à le réparer ... Toute autre supposition quelle pourrait être la raison?
Usman Yousaf