AmazonMWS nutzen mit C++/libcurl

Marketplaces werden immer beliebter. Ein Beleg dafür ist die ständig wachsende Zahl an neuen online Marktplätzen. Dabei gelten Amazon und eBay als Urväter der Marketplaces und werden reihenweise kopiert. Beispiele dafür sind

  • MeinPaket
  • Quelle
  • fnac (Frankreich)

Das Prinzip dieser Marktplätze ist grundsätzlich gleich. Es gibt ein Produkt welches mehrere Anbieter zu eigenen Preisen und Stückzahlen anbieten. Der Datenabgleich wird dabei meist über CSV-Dateien oder mittels moderner Webservices abgewickelt. Die Lösung über CSV-Dateien ist nur für kleinere Händler ausreichend und wird hier nicht weiter betrachtet.

Webservices

Als Vertreter der “modernen Webservices” sind meist SOAP oder REST anzutreffen. Wobei eBay auf SOAP setzt und im Vergleich dazu MeinPaket, fnac und Amazon alle REST Schnittstellen Anbieten. Bis zum 9. September 2011 stellte Amazon für seinen Marketplace eine SOAP Schnittstelle zur Verfügung. Alle Händler welche zwischen dem 9. September 2011  und dem 10. September 2011 SOAP verwendet haben, können dies auch bis zu 8. Oktober 2012 weiter verwenden[1]. Für alle anderen steht als Ersatz ein neuer REST Webservice bereit.

Meist gibt es für REST Webservices keine technische Beschreibung welche sich zum automatischen generieren eines Clients verwenden lässt. Bei SOAP leisten die Webservice Beschreibunssprache WSDL und der C/C++ Codegenerator gSOAP hervorragende Dienste.

Den Umstand der fehlenden technischen Beschreibung und eines passenden Code Generators umschifft der Autor mittels Templates. In einigen Fällen steht zumindest für die Daten(XML) eine Beschreibung auf Basis einer XSD bereit. Aus solchen XML Schema Definitionen lässt sich mit verschiedenen Generatoren passender C++ Code generieren. Amazon bietet für den REST Webservice keine solche Definition an, obwohl die Schnittstellen Dokumentation[2] offensichtlich mit Hilfe einer solchen generiert wurde.

Client

Amazon stellt fertige Client-Bibliotheken für PHP[3], C#[4] sowie Java[5] bereit. Im Folgenden wird unsere C++ Client-Bibliothek anhand von Beispielcodes vorgestellt.

Einführung

Alle Klassen und Funktionen befinden sich im Namensraum AmazonMWS um mögliche Kollisionen zu vermeiden. Alle Beispiele verwenden diesen Namensraum, mit Client ist also AmazonMWS::Client gemeint. Amazon teilt den MWS in 7 verschiedene Services auf.

  • Feed
  • FulfillmentInboundShipment
  • FulfillmentInventory
  • FulfillmentOutboundShipment
  • Order
  • Report
  • Sellers

Jeder Service stellt eigene Funktionen bereit. Diese Aufteilung findet sich ebenso in dem C++ Client wieder. Um die Funktionen eines Services zu nutzen muss also ein Client zu einem bestimmten Service erstellt werden. Im Beispiel 1 ist das der Service Order.

Beispiel 1

1
2
3
4
5
6
7
Client<Service::Order> orderClient(
    "mws.amazonservices.de",	// Endpoint
    "AXIXIXZX2X6X5XNXFXUX",	// AccessKey
    "Yayykyl/yfy4yYV3YoyBYRY7",	// SecretAccessKey
    "A2ZTZ7ZSZBZKZZ"		// MerchantId
);
double httpCode = orderClient.call(Service::Order::GetServiceStatus, cout);

Ausgabe:

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0"?>
<GetServiceStatusResponse xmlns="https://mws.amazonservices.com/Orders/2011-01-01">
	<GetServiceStatusResult>
		<Status>GREEN</Status>
		<Timestamp>2012-01-04T08:54:28.503Z</Timestamp>
	</GetServiceStatusResult>
	<ResponseMetadata>
		<RequestId>d0b4beba-80b8-4dc0-ae85-e9f3b8811838</RequestId>
	</ResponseMetadata>
</GetServiceStatusResponse>

Der einfachste Aufruf der Funktion call des Client Objektes nimmt die Funktion des Webservice und einen Ausgabestream entgegen. Die meisten Funktionen benötigen jedoch weitere Parameter.

Beispiel 2

…zeigt den komplexeren Aufruf der Webservicefunktion ListOrders des Order Service. Diese Funktion nimmt dabei verschiedene Parameter entgegen wie MaxResultsPerPage oder eine Liste von MarketplaceId. Die Ausgabe wird diesmal nicht direkt auf cout geschrieben sondern in einem stringstream zur weiteren Verarbeitung gespeichert.

1
2
3
4
5
6
7
8
9
10
stringstream response;
paramMap_t request;
request["LastUpdatedAfter"] = timestamp(second_clock::local_time() - hours(2));
request["MaxResultsPerPage"] = "5";
request["MarketplaceId.Id.1"] = "A1F83G8C2ARO7P"; //Amazon.co.uk
request["MarketplaceId.Id.2"] = "A1PA6795UKMFR9"; //Amazon.de
request["MarketplaceId.Id.3"] = "A13V1IB3VIYZZH"; //Amazon.fr
request["MarketplaceId.Id.4"] = "APJ6JRA9NG5V4";  //Amazon.it
 
double httpCode = orderClient.call(Service::Order::ListOrders, request, response);

In response sind nun 5 Bestellungen, die in den letzten 2 Stunden auf den angegebenen Marktplätzen geändert wurden, gespeichert. In den kompletten Beispielen wird die XML Antwort mittels des XML Parsers pugi weiter verarbeitet.

Interna

Intern verwendet diese C++ Client-Bibliothek boost für die Verarbeitung von timestamps, libcurl für die HTTP Übertragung sowie OpenSSL für die Base64 Berechnung und die HMAC SHA256 Verschlüsselung. Mit den Mitteln der C++ Template Programmierung und den genannten C/C++ Bibliotheken lassen sich REST Webservices komfortabel und sicher in C++ verwenden.

Download


  1. Hinweis von amazon.de zum auslaufen der SOAP Schnittstelle ^
  2. Amazon Marketplace Web Service Reports API Section Reference (Version 2009-01-01) ^
  3. Client-Bibliothek – PHP – Version 2009-01-01 ^
  4. Client-Bibliothek – C# – Version 2009-01-01 ^
  5. Client-Bibliothek – Java – Version 2009-01-01 ^

Helm & Walter IT Solutions GbR © 2017 • Impressum