Beim Versuch, unsere Magento-Schnittstelle zum GB Soft Warenwirtschaftssystem um die Erstellung von Produktkategorien zu erweitern, stieß ich auf folgenden Fehler:
Uncaught SoapFault exception: [103] Attribute "include_in_menu" is required
Nichts ungewöhnliches, dachte ich im ersten Moment. Beim näheren Blick auf die WSDL fiel mir jedoch sofort auf, dass ein Attribut mit dem Namen "include_in_menu" gar nicht vorgesehen ist! Ein bereits im Vorhinein zum Scheitern verurteilter Versuch, das Attribut trotzdem in den Request aufzunehmen, misslang natürlicherweise.
Bug oder Feature?
Dass die Arbeit mit der SOAP v2 Schnittstelle von Magento rauchende Köpfe verursachen kann, ist mir seit der ersten Auseinandersetzung damit bekannt. Dieses Problem roch aber von Anfang an sehr stark nach einem Bug. Dieser Eintrag im Magento-Forum bestätigte dann auch sogleich meinen Verdacht: es handelt sich um einen Fehler in der aktuellen Magento-Version!
Im erwähnten Forumeintrag wurden auch gleich folgende Workarounds vorgeschlagen, um das Problem bis zum offiziellen Bugfix zu beseitigen:
You have 4 ways.
First - Change app/code/core/Mage/Catalog/etc/wsdl.xml after line 188 add
<element name="include_in_menu" type="xsd:int" minOccurs="0" />
Second - Change logic of Api Model app/code/core/Mage/Catalog/Model/Category/Api/V2.php in code add this attribute to the new object.
Third - Report bug to the magento and wait until it resolved (near 1-2 month)
Fourth - And least create you extension where you just override app/code/core/Mage/Catalog/etc/wsdl.xml add your paramters to the WSDL file, change API model in your extensions for additional parameters.
My proposal use 4th way.
Ich werde das gleich mal ausprobieren!
und noch ein Fehler!
Kaum war der erste Fehler korrigiert, tauchte die nächste Fehlermeldung auf:
Uncaught SoapFault exception: [103] Attribute "available_sort_by" is required
Dieses Attribut existiert zwar in der WSDL, hat aber die falsche Signatur. Laut WSDL wird ein Array von String-Werten erwartet. Seit Version 1.4 verwaltet Magento dieses Attribut scheinbar nicht mehr als Array, sondern als komma-getrennten String. Auf das Webservice wurde aber offensichtlich komplett vergessen. Weder wird im Endpoint das Array auf einen String umgemappt, noch wurde die WSDL angepasst. Dh diese Änderung muss dann auch wieder manuell durchgeführt werden!
Den entscheidenden HInweis dafür habe ich wieder einmal im Magentoforum gefunden: http://www.magentocommerce.com/boards/v/viewthread/48184/#t163088
PHP WSDL Cache leeren
Zu guter letzt noch ein wichtiger Hinweis: wenn Sie die WSDL angepasst haben und danach immer noch die gleiche Fehlermeldung auftritt, sollten Sie sich vergewissern, dass Ihnen der WSDL-Cache von PHP nicht einen Strich durch die Rechnung macht. Standardmäßig wird die WSDL nämlich gecached. Gerade, wenn man den Type eines Attributs anpasst, kann das zu Problemen führen. Aus diesem Grund sollten Sie vorübergehend den WSDL-Cache abdrehen:
ini_set("soap.wsdl_cache_enabled", "0");
Ein Warenwirtschaftssystem (WaWi) ist eine Software zur zentralen Verwaltung und Steuerung von Warenbeständen, Beschaffung, Lagerung, Aufträgen und Auslieferung. Es verbindet typischerweise Einkauf, Lager, Verkauf und Rechnungswesen und schafft dadurch aktuelle Daten über Produkte und Bestände. Bei der Entwicklung individueller Webshops wird ein Warenwirtschaftssystem häufig über Schnittstellen mit dem E-Commerce-System verbunden, um Bestellungen, Preise und Lagerstände automatisiert abzugleichen.
Eine Schnittstelle ist eine definierte technische Verbindung, über die unterschiedliche Systeme, Anwendungen oder Datenquellen Informationen austauschen und Funktionen nutzen können. In der Webentwicklung ermöglichen Schnittstellen beispielsweise die Anbindung von ERP-, CRM- oder PIM-Systemen an eine Drupal-Plattform sowie die Integration externer Dienste und KI-Modelle. Sie legen fest, welche Daten in welchem Format übertragen werden und wie die beteiligten Systeme miteinander kommunizieren.
Die Web Services Description Language (WSDL) ist eine XML-basierte Beschreibungssprache, mit der die Funktionen, Datenformate, Kommunikationsprotokolle und Endpunkte eines Web Services maschinenlesbar definiert werden. Sie dient vor allem bei SOAP-Webservices als verbindlicher Vertrag zwischen Systemen und ermöglicht es Entwicklungswerkzeugen, daraus automatisiert Client- oder Server-Code zu erzeugen. In Unternehmensanwendungen erleichtert WSDL dadurch die standardisierte Anbindung von ERP-, CRM- und anderen Backend-Systemen.
Die Web Services Description Language (WSDL) ist eine XML-basierte Beschreibungssprache, mit der die Funktionen, Datenformate, Kommunikationsprotokolle und Endpunkte eines Web Services maschinenlesbar definiert werden. Sie dient vor allem bei SOAP-Webservices als verbindlicher Vertrag zwischen Systemen und ermöglicht es Entwicklungswerkzeugen, daraus automatisiert Client- oder Server-Code zu erzeugen. In Unternehmensanwendungen erleichtert WSDL dadurch die standardisierte Anbindung von ERP-, CRM- und anderen Backend-Systemen.
PHP ist eine serverseitig ausgeführte Programmiersprache, mit der dynamische Websites, Webanwendungen und Schnittstellen entwickelt werden. Sie bildet unter anderem die technische Grundlage von Drupal und wird im Enterprise-Umfeld häufig gemeinsam mit dem Symfony Framework eingesetzt, um skalierbare, wartbare und sichere Backend-Systeme zu realisieren. Der PHP-Code wird auf dem Webserver verarbeitet und erzeugt daraus beispielsweise HTML oder strukturierte API-Antworten.
Eine Application Programming Interface ist eine standardisierte Programmierschnittstelle, über die Softwareanwendungen Daten und Funktionen kontrolliert miteinander austauschen können. Sie legt fest, welche Anfragen ein System akzeptiert, in welchem Format Informationen übermittelt werden und welche Antworten zurückgegeben werden. In der Webentwicklung ermöglicht sie beispielsweise die Anbindung von ERP-, CRM- oder KI-Systemen an eine Drupal-Plattform und bildet damit eine wichtige Grundlage für skalierbare, integrierte digitale Lösungen.
Eine Application Programming Interface ist eine standardisierte Programmierschnittstelle, über die Softwareanwendungen Daten und Funktionen kontrolliert miteinander austauschen können. Sie legt fest, welche Anfragen ein System akzeptiert, in welchem Format Informationen übermittelt werden und welche Antworten zurückgegeben werden. In der Webentwicklung ermöglicht sie beispielsweise die Anbindung von ERP-, CRM- oder KI-Systemen an eine Drupal-Plattform und bildet damit eine wichtige Grundlage für skalierbare, integrierte digitale Lösungen.
Die Web Services Description Language (WSDL) ist eine XML-basierte Beschreibungssprache, mit der die Funktionen, Datenformate, Kommunikationsprotokolle und Endpunkte eines Web Services maschinenlesbar definiert werden. Sie dient vor allem bei SOAP-Webservices als verbindlicher Vertrag zwischen Systemen und ermöglicht es Entwicklungswerkzeugen, daraus automatisiert Client- oder Server-Code zu erzeugen. In Unternehmensanwendungen erleichtert WSDL dadurch die standardisierte Anbindung von ERP-, CRM- und anderen Backend-Systemen.
Die Web Services Description Language (WSDL) ist eine XML-basierte Beschreibungssprache, mit der die Funktionen, Datenformate, Kommunikationsprotokolle und Endpunkte eines Web Services maschinenlesbar definiert werden. Sie dient vor allem bei SOAP-Webservices als verbindlicher Vertrag zwischen Systemen und ermöglicht es Entwicklungswerkzeugen, daraus automatisiert Client- oder Server-Code zu erzeugen. In Unternehmensanwendungen erleichtert WSDL dadurch die standardisierte Anbindung von ERP-, CRM- und anderen Backend-Systemen.
Eine Application Programming Interface ist eine standardisierte Programmierschnittstelle, über die Softwareanwendungen Daten und Funktionen kontrolliert miteinander austauschen können. Sie legt fest, welche Anfragen ein System akzeptiert, in welchem Format Informationen übermittelt werden und welche Antworten zurückgegeben werden. In der Webentwicklung ermöglicht sie beispielsweise die Anbindung von ERP-, CRM- oder KI-Systemen an eine Drupal-Plattform und bildet damit eine wichtige Grundlage für skalierbare, integrierte digitale Lösungen.
Die Web Services Description Language (WSDL) ist eine XML-basierte Beschreibungssprache, mit der die Funktionen, Datenformate, Kommunikationsprotokolle und Endpunkte eines Web Services maschinenlesbar definiert werden. Sie dient vor allem bei SOAP-Webservices als verbindlicher Vertrag zwischen Systemen und ermöglicht es Entwicklungswerkzeugen, daraus automatisiert Client- oder Server-Code zu erzeugen. In Unternehmensanwendungen erleichtert WSDL dadurch die standardisierte Anbindung von ERP-, CRM- und anderen Backend-Systemen.
Die Web Services Description Language (WSDL) ist eine XML-basierte Beschreibungssprache, mit der die Funktionen, Datenformate, Kommunikationsprotokolle und Endpunkte eines Web Services maschinenlesbar definiert werden. Sie dient vor allem bei SOAP-Webservices als verbindlicher Vertrag zwischen Systemen und ermöglicht es Entwicklungswerkzeugen, daraus automatisiert Client- oder Server-Code zu erzeugen. In Unternehmensanwendungen erleichtert WSDL dadurch die standardisierte Anbindung von ERP-, CRM- und anderen Backend-Systemen.
Die Web Services Description Language (WSDL) ist eine XML-basierte Beschreibungssprache, mit der die Funktionen, Datenformate, Kommunikationsprotokolle und Endpunkte eines Web Services maschinenlesbar definiert werden. Sie dient vor allem bei SOAP-Webservices als verbindlicher Vertrag zwischen Systemen und ermöglicht es Entwicklungswerkzeugen, daraus automatisiert Client- oder Server-Code zu erzeugen. In Unternehmensanwendungen erleichtert WSDL dadurch die standardisierte Anbindung von ERP-, CRM- und anderen Backend-Systemen.
Die Web Services Description Language (WSDL) ist eine XML-basierte Beschreibungssprache, mit der die Funktionen, Datenformate, Kommunikationsprotokolle und Endpunkte eines Web Services maschinenlesbar definiert werden. Sie dient vor allem bei SOAP-Webservices als verbindlicher Vertrag zwischen Systemen und ermöglicht es Entwicklungswerkzeugen, daraus automatisiert Client- oder Server-Code zu erzeugen. In Unternehmensanwendungen erleichtert WSDL dadurch die standardisierte Anbindung von ERP-, CRM- und anderen Backend-Systemen.
Die Web Services Description Language (WSDL) ist eine XML-basierte Beschreibungssprache, mit der die Funktionen, Datenformate, Kommunikationsprotokolle und Endpunkte eines Web Services maschinenlesbar definiert werden. Sie dient vor allem bei SOAP-Webservices als verbindlicher Vertrag zwischen Systemen und ermöglicht es Entwicklungswerkzeugen, daraus automatisiert Client- oder Server-Code zu erzeugen. In Unternehmensanwendungen erleichtert WSDL dadurch die standardisierte Anbindung von ERP-, CRM- und anderen Backend-Systemen.
Die Web Services Description Language (WSDL) ist eine XML-basierte Beschreibungssprache, mit der die Funktionen, Datenformate, Kommunikationsprotokolle und Endpunkte eines Web Services maschinenlesbar definiert werden. Sie dient vor allem bei SOAP-Webservices als verbindlicher Vertrag zwischen Systemen und ermöglicht es Entwicklungswerkzeugen, daraus automatisiert Client- oder Server-Code zu erzeugen. In Unternehmensanwendungen erleichtert WSDL dadurch die standardisierte Anbindung von ERP-, CRM- und anderen Backend-Systemen.
Die Web Services Description Language (WSDL) ist eine XML-basierte Beschreibungssprache, mit der die Funktionen, Datenformate, Kommunikationsprotokolle und Endpunkte eines Web Services maschinenlesbar definiert werden. Sie dient vor allem bei SOAP-Webservices als verbindlicher Vertrag zwischen Systemen und ermöglicht es Entwicklungswerkzeugen, daraus automatisiert Client- oder Server-Code zu erzeugen. In Unternehmensanwendungen erleichtert WSDL dadurch die standardisierte Anbindung von ERP-, CRM- und anderen Backend-Systemen.
PHP ist eine serverseitig ausgeführte Programmiersprache, mit der dynamische Websites, Webanwendungen und Schnittstellen entwickelt werden. Sie bildet unter anderem die technische Grundlage von Drupal und wird im Enterprise-Umfeld häufig gemeinsam mit dem Symfony Framework eingesetzt, um skalierbare, wartbare und sichere Backend-Systeme zu realisieren. Der PHP-Code wird auf dem Webserver verarbeitet und erzeugt daraus beispielsweise HTML oder strukturierte API-Antworten.
Das Simple Object Access Protocol (SOAP) ist ein standardisiertes Protokoll für den strukturierten Austausch von Nachrichten zwischen Anwendungen über Netzwerke. Die Nachrichten werden in XML formatiert und enthalten neben den Nutzdaten auch Metadaten für Fehlerbehandlung, Sicherheit oder Transaktionen; häufig erfolgt die Übertragung über HTTP, alternativ etwa über SMTP. SOAP eignet sich besonders für formalisierte, zuverlässige Schnittstellen zwischen Unternehmenssystemen, beispielsweise zur Anbindung von ERP-, CRM- oder CMS-Plattformen.
Ich finde es ehrlich gesagt eine Frechheit von Varien, dass man so schleißig mit solchen Bugs umgeht. Sowas müsste IMHO sofort auffallen, würde man die API vor einem Release auch nur ein einziges mal testen.
Jetzt haben wir die 1.5.0.1er Version und der Bug ist immer noch da.
Danke jedenfalls für das Teilen deiner Erfahrungen in diesem Blog-Post!
Gern geschehen :)
Leider kommt mir das auch so vor, dass sie den v2 Webservice entwickelt, einmal getestet und dann nie wieder angegriffen haben. Unbeachtet dessen, dass Veränderungen im Model dann zu Problemen mit dem Webservice führen können. Neue Features gehen scheinbar vor, Bugs ausbessern scheint da eine niedrigere Priorität zu haben.
Was ich aber noch schlimmer finde, sind die teils folgenreichen Änderungen im Model selbst bei kleinen Versionssprüngen. Ehrlichgesagt traue ich mir kein Magento-Update zu machen, wenn das Ding einmal läuft. Auch dann nicht, wenn man Module und Template sauber mit Overriding erstellt hat und nicht in den core-Files rumgepfuscht hat...