Das SOAP-Netzwerkprotokoll ermöglicht eine schnelle, einfache und sichere Kommunikation zwischen Magento und externen Systemen, wie z.B. ERP-Systeme oder auch mobile Apps.
Mit dem SOAP-Protokoll hat die Sprache der externen Applikation eigentlich keine Bedeutung. Wir können Informationen über Produkte, Kunden, Bestellungen und viel mehr sowohl empfangen als auch übersenden. Und mit etwas Eigeneinsatz können wir auch neue Methoden erstellen, die uns die erforderlichen Daten entsprechend formatiert zurückschicken.
Noch vor dem Start
Magento unterstützt SOAP in den beiden Versionen (Version 1 und 2). Die Methoden und Adressen, auf die wir zurückgreifen, sind je nach der eingesetzten Version unterschiedlich.
Adresse für SOAP v1
<a href="http://magentohost/api/soap/?wsdl">http://magento.dev/api/soap/?wsdl</a>
Adresse für SOAP v2
<a href="http://magento.dev/api/v2_soap/?wsdl">http://magento.dev/api/v2_soap/?wsdl</a>
Beispielmethode für SOAP v1
catalog_category.info
Dieselbe Methode für SOAP v2
catalogCategoryInfo
In unseren Beispielen verwenden wir die für SOAP v1 charakteristischen Methoden. Es spricht aber nichts dagegen, SOAP v2 zu verwenden.
Benutzer erstellen
Zuerst muss der Benutzer erstellt und mit entsprechenden Berechtigungen ausgestattet werden. Dies können Sie im Adminpanel Magento auf der Seite:
System → Web Services → SOAP/XML-RPC – Users tun und folgend auf die Taste Add New User klicken.
Wenn Sie einen neuen Benutzer erstellen, müssen Sie alle Felder ausfüllen. Vergessen Sie nicht, dass der Inhalt des API Key und API Key Confirmation als Zugangsdaten zum API gilt.
In der Bookmark User Role können Sie dem Benutzer entsprechende Berechtigungen zuweisen. Die Berechtigungspakete können folgend erstellt und bearbeitet werden:
System → Web Services → SOAP/XML-RPC – Roles
Läuft alles richtig?
Ist der Benutzer schon erstellt, können wir ein einfaches Script in PHP schreiben, um zu überprüfen, ob alles richtig funktioniert:
$soap = new SoapClient('http://magento.dev/api/soap/?wsdl');$sessionId = $soap->login('apiUser', 'apiKey');
$result = $soap->call($sessionId, 'catalog_category.info', '2');
var_dump($result);
Die Antwort soll wie folgt sein:
array'category_id' => string '2' (length=1)
'is_active' => string '1' (length=1)
…
Haben wir eine richtige Antwort erhalten, können wir sicher sein, dass API richtig konfiguriert wurde und einsatzbereit ist.
Wie SOAP zu verwenden ist
Die Verwendung von SOAP zwecks Kommunikation mit Magento ist äußerst einfach.
Beispiel 1
Nehmen wir an, dass wir eine Liste von allen Produkten mit folgenden Daten brauchen ProductId, Name, Sku, Type. Um diese Daten zu gewinnen, brauchen Sie nur die Methode catalog_product.list zu verwenden.
$soap = new SoapClient('http://magento.dev/api/soap/?wsdl');$sessionId = $soap->login('apiUser', 'apiKey');
$result = $soap->call($sessionId, 'catalog_product.list', '2');
var_dump($result);
$result enthält alle erforderlichen Informationen in Form von einer Tabelle.
Beispiel 2
Nehmen wir an, wir möchten eine neue Konfiguration erstellen und sie der schon bestehenden Konfiguration mit CategoryId = 10 zuordnen.
$soap = new SoapClient('http://magento.dev/api/soap/?wsdl');$sessionId = $soap->login('apiUser', 'apiKey');
//creating category
$categoryId = $soap->call($session, 'catalog_category.create', array(2, array(
'name' => 'New category',
'is_active' => 1,
'position' => 1,
'available_sort_by' => 'position',
'custom_design' => null,
'custom_apply_to_products' => null,
'custom_design_from' => null,
'custom_design_to' => null,
'custom_layout_update' => null,
'default_sort_by' => 'position',
'description' => 'Description',
'display_mode' => null,
'is_anchor' => 0,
'landing_page' => null,
'meta_description' => 'Meta description',
'meta_keywords' => 'Meta keywords',
'meta_title' => 'Meta title',
'page_layout' => 'two_columns_left',
'url_key' => 'url-key',
'include_in_menu' => 1,
)));if ($categoryId) {
$result = $soap->call(
$session,
'catalog_category.move',
array('categoryId' => $categoryId, 'parentId' => '10')
);var_dump($result);
}
Wo sind die Methoden und die Verwendungsbeispiele für SOAP zu kriegen?
Alle Methoden und einfache Verwendungsbeispiele finden Sie auf der Webseite von Magento. Die Webseite wird ständig entwickelt, deshalb lohnt es sich, sie ab und zu zu besuchen.
Erweiterung der Funktionalitäten
Es kann vorkommen, dass die werkseitig zur Verfügung gestellten Methoden nicht ausreichend sind. In solch einem Fall spricht nichts dagegen, API magento zu erweitern und eigene Methoden hinzufügen, die den von uns angegebenen Code realisieren. Zuerst müssen Sie ein neues Modul hinzufügen. Für diesen Artikel habe ich das Modul Creativestyle_Newapi verwendet.
In dem hinzugefügten Modul erstellen wir ein neues Modell mit dem Namen Api.php
class Creativestyle_Newapi_Model_Api extends Mage_Api_Model_Resource_Abstract
{}
Wenn wir SOAP v2 verwenden möchten, brauchen wir ein zusätzliches Modell V2.php
class Creativestyle_Newapi_Model_Api_V2 extends Creativestyle_Newapi_Model_Api
{}
Zu dem Katalog etc/ des Moduls müssen wir die Datei api.xml hinzufügen.
<?xml version="1.0"?><config>
<api>
<resources>
<newapi translate="title" module="creativestyle_newapi">
<title>New Api</title>
<model>newapi/api</model>
<methods>
</methods>
</newapi>
</resources>
</api>
</config>
Wenn unsere Struktur schon fertig ist, können wir die eigenen Methoden kreieren.
Beispiel 1
Nehmen wir an, wir möchten die Anzahl der Produkte auf Lager erhöhen. Sku, ProductId kennen wir nicht, aber wir verfügen über das einmalige Attribut für das gegebene Produkt. In diesem Beispiel ist das ISBN.
/*** Update product stock
*
* @param string $isbn
* @param int $qty
*/
public function update($isbn, $qty)
{
if (empty($isbn)) {
return $this->_error('ISBN required');
}
if (empty($qty)) {
return $this->_error('Qty required');
}
$product = Mage::getModel('catalog/product')->loadByAttribute('isbn', $isbn);
if($product && $product->getEntityId()){
$stockData = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product);
$stockData->addQty($qty);
try{
$stockData->save();
return $this->_return('OK', $product->getEntityId(), 200);
} catch (Exception $e){
return $this->_error('An exception occurred: ' . $e->getMessage());
}
}
}
Nach der Vorbereitung der Funktion, müssen wir sie auch zu der Datei api.xml hinzufügen.
<resources><newapi translate="title" module="creativestyle_newapi">
<title>New Api</title>
<model>newapi/api</model>
<methods>
<update translate="title" module="creativestyle_newapi">
<title>Update product stock amount</title>
</update>
</methods>
</newapi></resources>
</php>
ACHTUNG! Wenn wir SOAP v2 verwenden, müssen wir noch eine Datei – wsdl.xml erstellen, die wir in den Katalog etc/ des Moduls setzen.
<?xml version="1.0" encoding="UTF-8"?><definitions xmlns:typens="urn:" 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="" targetNamespace="urn:">
<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/" />
</schema>
</types>
<message name="newapiUpdateRequest">
<part name="sessionId" type="xsd:string"/>
<part name="isbn" type="xsd:string" />
<part name="qty" type="xsd:string" />
</message>
<message name="newapiUpdateResponse">
<part name="result" type="xsd:string" />
</message>
<portType name="PortType">
<operation name="newapiUpdate">
<documentation>Newapi: Update product stock amount</documentation>
<input message="typens:newapiUpdateRequest" />
<output message="typens:newapiUpdateResponse" />
</operation>
</portType>
<binding name="Binding" type="typens:PortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
<operation name="newapiUpdate">
<soap:operation soapAction="urn:Action" />
<input>
<soap:body namespace="urn:" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</input>
<output>
<soap:body namespace="urn:" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
</binding>
<service name="Service">
<port name="Port" binding="typens:Binding">
<soap:address location="" />
</port>
</service>
</definitions>
Bei weiteren Funktionen brauchen wir nur Informationen über die Funktionen zu der schon bestehenden Datei wsdl.xml hinzuzufügen. Viel Erfolg!