Tutorial Amazon Web Services mit PHP – II – cURL und SimpleXML

Im vorherigen Teil haben wir zumindest schon einmal einen API-Key und eine Partner-ID besorgt, jetzt geht es ans Eingemachte. AWS sind ein Service, der logischerweise per XML angesprochen wird. Will heißen: Ich rufe eine URL mit den entsprechenden Parametern auf und erhalte als Antwort eine XML, die ausgewertet werden muss.

Also Beispiel folgende URL:

http://ecs.amazonaws.de/onca/xml?Service=AWSECommerceService

gibt folgendes Ergebnis zurück:

<?xml version="1.0" encoding="UTF-8"?>
<Errors xmlns="http://webservices.amazon.com/AWSECommerceService/2005-10-05">
   <Error>
      <Code>AWS.InvalidOperationParameter</Code>
      <Message>The Operation parameter is invalid. Please modify the Operation parameter and retry. Valid values for the Operation parameter include TagLookup, ListLookup, CartGet, SellerListingLookup, CustomerContentLookup, ItemLookup, SimilarityLookup, SellerLookup, ItemSearch, VehiclePartLookup, BrowseNodeLookup, CartModify, ListSearch, CartClear, VehiclePartSearch, CustomerContentSearch, CartCreate, TransactionLookup, VehicleSearch, SellerListingSearch, CartAdd, Help.</Message>
   </Error>
</Errors>

Wobei es sich logischerweise um eine Fehlermeldung handelt, da wir den AWS nicht gesagt haben, was wir von ihnen wollen. Aus PHP-Sicht kommen nun direkt zwei Probleme auf einen zu:

a) Man muss Inhalte von einer entfernten URL einlesen und verarbeiten
b) Man muss das XML verstehen und parsen, das man als Antwort erhält

Beim Punkt a) hilft uns cURL – eine Bibliothek von Daniel Stenberg, die Verbindungen zu verschiedensten Servern unter Verwendung diverser Protokolle erlaubt. Mit cURL können wir die oben genannte URL öffnen, und die Antwort des Services in einem String speichern:

1
2
3
4
5
6
7
8
9
10
11
12
// Initialisieren einer cURL-Session, und den resultierenden Handler in $ch speichern.
$ch = curl_init();
// cURL die gewünschte URL mitteilen
curl_setopt( $ch, CURLOPT_URL, „http://ecs.amazonaws.de/onca/xml?Service=AWSECommerceService" );
// Die Ausgabe des Headers unterdrücken
curl_setopt( $ch, CURLOPT_HEADER, 0 );
// Die Antwort als String zurück geben
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
// Seite aufrufen und Antwort in $answer speichern
$answer = curl_exec( $ch );
// Ressourcen wieder freigeben
curl_close( $ch );

Nach diesen einfachen Zeilen Code ist die Antwort der AWS nun in der Variable $answer gespeichert. Man könnte diese zum Beispiel durch ein echo $answer; ausgeben, und würde das gleiche Ergebnis sehen, wie bei einem direkten Aufruf der URL mit dem Browser.

In $answer ist nun allerdings ein XML gespeichert, das wir verstehen und auswerten müssen. Hierbei hilft uns SimpleXML, das – wie der Name schon sagt – eine einfache Bearbeitung von XML ermöglichen soll. Besonders interessant für uns ist die Funktion simplexml_load_string, die eine XML aus einem String in ein Objekt überführt. Dieses Objekt kann dann einfach weiter bearbeitet werden. Anhand unseres Beispiels ist dies recht einfach nachzuvollziehen:

1
2
$xmlobject = simple_xml_load_file( $answer );
var_dump( $xmlobject );

Die Ausgabe hilft auf den ersten Blick zwar nicht viel weiter als das XML, wir haben aber nun ein Objekt, mit dem wir arbeiten können:

object(SimpleXMLElement)#1 (1) {
  ["Error"]=>
  object(SimpleXMLElement)#2 (2) {
    ["Code"]=>
    string(29) "AWS.InvalidOperationParameter"
    ["Message"]=>
    string(461) "The Operation parameter is invalid. Please modify the Operation parameter and retry. Valid values for the Operation parameter include TagLookup, ListLookup, CartGet, SellerListingLookup, CustomerContentLookup, ItemLookup, SimilarityLookup, SellerLookup, ItemSearch, VehiclePartLookup, BrowseNodeLookup, CartModify, ListSearch, CartClear, VehiclePartSearch, CustomerContentSearch, CartCreate, TransactionLookup, VehicleSearch, SellerListingSearch, CartAdd, Help."
  }
}

Eine „Eigenart“ von SimpleXML ist es derweil, ein umgebendes XML-Tag zu unterdrücken, das <Errors> aus obigem Beispiel hat es nicht ins XML geschafft! Dies sollte man immer in Gedächtnis behalten, da man ansonsten graue Haare bekommt, wenn man auf Pfade innerhalb des XML zugreifen will.

Möchte man sich jetzt nur den Error-Code der AWS anzeigen lassen, reicht die folgende Zeile Code:

echo $xmlobject->Error->Code;

Somit kann man nun einfach die Antwort der AWS auswerten und weiter verarbeiten. Allerdings kann man sich nun ebenfalls an 5 Finger abzählen das bei einer solchen Abfrage jede Menge Fehler auftreten können, im schlimmsten Fall zum Beispiel das keine Verbindung zu den AWS aufgebaut wird. Das Ganze ist derzeit auch nicht sonderlich performant. Es macht zum Beispiel keinen Sinn permanent alle Daten von den AWS live herunterzuladen, deshalb beschäftigen wir uns im nächsten Teil des Tutorials zunächst einmal mit dem Cachen von Funktionsaufrufen in PHP.

Ähnliche Beiträge

Der perfekte Code Editor für PHP Zur Abwechslung fange ich mal mit einem Rant an! ;) Diese ganzen halbgaren Java-Zeitlupen-IDEs nerven, und zwar ganz gehörig. Ist ja nett das Java so ...
Application.ini – Cheat Sheet für das Zend F... Das Zend Framework ist so eine Sache, es kommt unheimlich gut an beim Kunden, aber unter "normalen Umständen" wäre es sicherlich nicht meine erste Wah...
Cookies sind ja so was von 2012 … Sagen wir mal so: die Intention von Cookies ist ganz nett, die Tatsache wie sie heute genutzt werden eher nicht. Ein Cookie ist immer an eine Domain g...
Vergleich von PHP-Entwicklungsumgebungen PHP-Entwicklungsumgebungen gibt es inzwischen wie Sand am Meer. Jede behauptet von sich die einzig wahre zu sein, und natürlich ist es fast unmöglich ...

2 Antworten auf „Tutorial Amazon Web Services mit PHP – II – cURL und SimpleXML“

  1. Wieder falsch!
    Warum wird im Text die Funktion simplexml_load_string() erwähnt, im Code dann aber simple_xml_load_file(), bzw. simplexml_load_file() verwendet? Es soll doch gar kein File eingelesen werden. Der Inhalt ist doch bereits in einem String!

    Richtig müsste also sein:
    $xmlobject = simplexml_load_string( $answer );
    var_dump( $xmlobject );

  2. Hallo,

    tolles Tutorial. Habe einen Fehler entdeckt und zwar im Code zu SimpleXML.

    $xmlobject = simple_xml_load_file( $answer );
    var_dump( $xmlobject );

    richtig wäre

    $xmlobject = simplexml_load_file( $answer );
    var_dump( $xmlobject );

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.